刷新的OAuth2令牌具有无效签名(Azure AD OAuth2)

时间:2018-06-18 11:30:11

标签: oauth oauth-2.0 azure-active-directory

我尝试创建一个身份验证流程,其中用户的访问令牌与刷新令牌一起保存在服务器端会话中,当令牌过期时,如果会话仍然存在,则续订有效。但是,在使用与原始令牌相同的方法验证时,我在刷新后从Azure AD返回的令牌具有无效签名。

这是一个可以说明问题的可运行的要点:https://gist.github.com/tlycken/fdaf47dc31e03de43a1a07fbbea2ab91

我所做的基本上是这样的:

  1. 当用户请求页面时,请检查会话。如果不存在,则重定向到/auth,重定向到Azure AD,当我返回时,我有一个有效的令牌,我存储在会话中。

  2. 使用jwks-rsa验证会话中的令牌。 (这通常可以正常工作,所以我故意在令牌字符串中添加一些东西,使签名在测试代码中无效。)

  3. 如果令牌验证失败,并且会话中有刷新令牌,请尝试使用该刷新令牌获取新令牌。此请求通常以状态200 OK和一组新的访问/刷新令牌返回。

  4. 使用与验证旧访问令牌相同的代码验证新访问令牌(现在没有乱码令牌)。 这应该可行,IIUC,但它失败并显示错误invalid signature

  5. 为什么我新刷新的令牌未通过验证?

    更新的 我能够创建一个更简单的流程来重现这个;要点已经更新。它现在执行以下操作(沿途打印这些消息):

    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发送请求,希望这样的请求因无效令牌而失败。但它过去了!

1 个答案:

答案 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`)