代码之家  ›  专栏  ›  技术社区  ›  Tomas Aschan

刷新的OAuth2令牌具有无效签名(azure ad oauth2)

  •  8
  • Tomas Aschan  · 技术社区  · 6 年前

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

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

    我要做的基本上是:

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

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

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

    4. 使用与用于验证旧访问令牌相同的代码验证新的访问令牌(现在没有混淆令牌)。 这应该可以,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发送了一个请求,希望这样的请求对于无效的令牌会失败。但它过去了!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Marc LaFleur    6 年前

    您的代码使用v1端点来获取初始访问令牌,而v2端点来驱除刷新令牌。这两个端点的操作方式不同。特别是,v1端点使用“resource”,而v2使用“scopes”。

    发生这种情况的原因是您显式地调用v1,但依赖于v2 /openid-configuration 用于刷新令牌终结点。

    要更正此问题,请更改第19行 refresh-auth-token.js

    const configResponse = 
       await fetch(`https://login.microsoftonline.com/${AZURE_TENANT}/.well-known/openid-configuration`)