【问题标题】:Fresh but invalid id_token新鲜但无效的 id_token
【发布时间】:2017-10-20 06:29:56
【问题描述】:

我向 Google 或 Microsoft 请求一个 openid id_token,并且在通过议案并同意我的应用程序请求openid 的范围后,一个 id_token 被正式返回。我可以将其拆分为点,前两部分可以解码为有效的 JSON,因此它是 JWT,这一点毫无疑问。

但是,当我尝试将其用作对带有 [Authorize] 注释的 aspnetcore WebApi 方法的请求的授权标头中的不记名令牌时,我得到 401 Unauth,带有此标头:

WWW-Authenticate: Bearer error=invalid_token, error_description="The signature is invalid"

在我看来,微软和谷歌都不太可能发布无效的 JWT。所以现在我需要知道什么会导致中间件产生这种反应,它是最新的并且设置如下:

app.UseJwtBearerAuthentication(new JwtBearerOptions { SaveToken = true });

如果它很重要,这是我为令牌请求编辑的参数。

  "uri": "https://accounts.google.com/o/oauth2/auth",
  "parameters": {
    "request_type": "token",
    "response_type": "id_token",
    "client_id": "REDACTED.apps.googleusercontent.com",
    "redirect_uri": "https://REDACTED/",
    "scope": "openid",
    "state": "STATE",
    "nonce": "wibble",
    "allow_signup": "true"
  }

当我弄清楚这一点时,显然 state 和 nonce 是稳定的虚拟值。

所以,无效?怎么回事?我尝试使用http://jwt.io 来检查我的代码捕获的令牌,它似乎并不令人不快。标头和有效负载已解码,但我不太清楚如何验证签名,他们想要更多值,我不清楚从哪里获得它们。这方面的指导可能会有所帮助。

这是我提取的令牌。

eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ.eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30.Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ

为了您的方便,这里又是分开的点。

eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ

eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30

Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ

这个显然已经过期了,但是如果你知道如何验证签名,它可能会很方便检查我是否损坏了提取它的令牌。 谁能帮助我了解问题所在以及如何处理?

汉斯在下面的回答似乎很可能,但现实似乎与文档不符。然后我找到了这个问题Microsoft Account OpenID authentication token request returns id_token but not access_token,并得到了一位 MSFT 人员的回答。当您请求范围时,您似乎只会获得一个身份验证令牌。这是有道理的;身份验证令牌授权访问令牌请求中指定的一个或多个资源。我的请求中指定的唯一范围是 openid,它是对收到的 id_token 的请求。

但我并不想获得使用提供程序范围(如用户的通讯录或电子邮件)的许可。我正在尝试将身份验证委托给提供者。不是授权。我希望建立用户的身份 - 据我了解,这是id_token 的重点,我想使用我自己的用户角色数据库进行自己的授权,该数据库基本上定义了应用程序特定的范围。

我认为这仍然是一个可以回答的问题,即使答案是关于如何使用 aspnetcore web api 进行此操作的缩略图,并由相关文档的链接提供支持。

OAuth 2 access_token vs OpenId Connect id_token 明确表示这是受支持的方案。这里的关键词是 SSO 或单点登录。我开始认为这更多是关于如何为使用 aspcorenet webapi 的 SPA 进行 SSO 的问题。

但最初的问题是:为什么这些令牌似乎无效 签名?

【问题讨论】:

    标签: openid aurelia asp.net-core-webapi


    【解决方案1】:

    在 Google 和 Microsoft 支持的 OpenID Connect 流程中,您将在对授权请求的响应中同时获得 id_tokenaccess_tokenid_token 用于向客户端(即您的应用程序)验证用户身份,access_token 可用于访问 API。

    因此,您应该在 API 调用的 Authorization: bearer <token> 标头中显示 access_token,而不是 id_token

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2017-09-05
      • 2014-05-31
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多