我尝试创建一个身份验证流程,其中用户的访问令牌与刷新令牌一起保存在服务器端会话中,当令牌过期时,如果会话仍然存在,则续订有效。但是,在使用与原始令牌相同的方法验证时,我在刷新后从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
除了自己验证令牌之外,我现在还向Azure发送请求,希望这样的请求因无效令牌而失败。但它过去了!
答案 0 :(得分:2)
您正在使用v1端点获取初始访问令牌,而使用v2端点执行刷新令牌。这两个端点的操作方式不同。特别是,v1端点使用“资源”,而v2使用“范围”。
发生这种情况的原因是您显式调用v1,但依赖于v2 /openid-configuration
来刷新令牌端点。
要解决此问题,请将refresh-auth-token.js
的第19行更改为
const configResponse =
await fetch(`https://login.microsoftonline.com/${AZURE_TENANT}/.well-known/openid-configuration`)