Tom*_*han 8 oauth oauth-2.0 azure-active-directory
我正在尝试创建一个身份验证流,其中用户的访问令牌与刷新令牌一起保存在服务器端会话中,当令牌过期时,如果会话仍然有效,则会续订.但是,在使用与原始令牌相同的方法验证时,刷新后从Azure AD返回的令牌具有无效签名.
这是一个可以说明问题的可运行的要点:https://gist.github.com/tlycken/fdaf47dc31e03de43a1a07fbbea2ab91
我正在做的基本上是这样的:
当用户请求页面时,检查会话.如果不存在,则重定向到/auth重定向到Azure AD,当我返回时,我有一个有效的令牌,我存储在会话中.
使用以下方式验证会话中的令牌jwks-rsa.(这通常可以正常工作,所以我故意在令牌字符串中添加一些东西,使签名在测试代码中无效.)
如果令牌验证失败,并且会话上有刷新令牌,请尝试使用该刷新令牌获取新令牌.此请求通常返回状态200 OK和一组新的访问/刷新令牌.
使用与验证旧访问令牌相同的代码验证新访问令牌(现在没有乱码令牌).这应该工作,IIUC,但它失败了错误invalid signature.
为什么我新刷新的令牌未通过验证?
更新: 我能够创建一个更简单的流程来重现这个; 要点已经更新.它现在执行以下操作(沿途打印这些消息):
no session, redirecting to /auth
successful auth callback, redirecting to /
verifying old token
decoded user id e7f02a6e-510c-430d-905c-f8a0e63206c2
refreshing
fetching /me with renewed token
got user id e7f02a6e-510c-430d-905c-f8a0e63206c2
verifying new token
token verification failed: invalid signature
Run Code Online (Sandbox Code Playgroud)
除了自己验证令牌之外,我现在还向Azure发送请求,希望这样的请求会因无效令牌而失败.但它过去了!
您的代码使用 v1 端点来获取初始访问令牌,但使用 v2 端点来消除刷新令牌。这两个端点的操作方式不同。特别是,v1 端点使用“资源”,而 v2 使用“范围”。
发生这种情况的原因是您显式调用 v1 但依赖 v2/openid-configuration来获取刷新令牌端点。
要纠正此问题,请将第 19 行更改refresh-auth-token.js为
const configResponse =
await fetch(`https://login.microsoftonline.com/${AZURE_TENANT}/.well-known/openid-configuration`)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |