【问题标题】:Azure Access Token - Invalid Signature in Jwt.ioAzure 访问令牌 - Jwt.io 中的签名无效
【发布时间】:2021-03-16 20:02:41
【问题描述】:

这是一场噩梦。我在使用 jwt.io 验证 Azure 访问令牌签名时遇到问题。不管我做什么,答案总是无效的签名。

有人可以帮忙吗?

我的步骤:

  1. 我从 MSAL Java 应用示例 (msal-java-webapp-sample) 生成了令牌 ID 和访问令牌。
  2. 我从 Azure 访问令牌中获得访问令牌标头中访问 jwt.io 的“孩子”。
  3. 我访问"https://login.microsoftonline.com/<TENANT_ID>/v2.0/.well-known/openid-configuration"
  4. 我从第 3 步打开链接“jwks_uri”访问。"https://login.microsofto…f143/discovery/v2.0/keys"
  5. 我从第 2 步得到了孩子,我在 "https://login.microsofto…f143/discovery/v2.0/keys" 找到了它。
  6. 我复制步骤 5 中描述的 URL 中的“x5c”。
  7. 我打开 jwt.io。
  8. 我复制从第 2 步检索到的访问令牌并将其复制到编码字段中。
  9. 我将第 6 步中检索到的“x5c”属性复制到有关签名的第一个字段中。 (布局-1)

----- 布局 1 ----

-----开始公钥----- MIIDBTCCAe2gAwIBAgIQQiR8gZNKuYpH6cP + KIE5ijANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTIwMDgyODAwMDAwMFoXDTI1MDgyODAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkymupuRhTpZc + 6CBxQpL0SaAb + 8CzLiiDyx2xRoecjojvKN2pKKjIX9cejMSDRoWaOnZCK4VZVX1iYRCWT1WkHb8r1ZpSGa7oXG89zxjKjwG46tiamwdZjJ7Mhh8fqLz9ApucY / LICPMJuu6d56LKs6hb4OpjylTvsNUAa + bHg1NgMFNg0fPCxdr9N2Y4J + Jhrz3VDl4oU0KDZX / pyRXblzA8kYGWm50dh5WB4WoB8MtW3lltVrRGj8 / IgTf9GxpBsO9OWgwVByZHU7ctZs7AmUbq / 59Ipql7vSM6EsoquXdMiq0QOcZAPitwzHkTKrmeULz0 / RHnuBGXxS / e8wX0CAwEAAaMhMB8wHQYDVR0OBBYEFGcWXwaqmO25Blh2kHHAFrM / AS2CMA0GCSqGSIb3DQEBCwUAA4IBAQDFnKQ98CBnvVd4OhZP0KpaKbyDv93PGukE1ifWilFlWhvDde2mMv / ysBCWAR8AGSb1pAW / ZaJlMvqSN / + dXihcHzLEfKbCPw4 / Mf2ikq4gqigt5t6hcTOSxL8wpe8OKkbNCMcU0cGpX5NJoqhJBt9SjoD3VPq7qRmDHX4h4nniKUMI7awI94iGtX / vlHnAMU4 + 8y6sfRQDGiCIWPSyypIWfEA6 / O + SsEQ7vZ / b4mXlghUmxL + o2emsCI1e9PORvm5yc9Y / htN3Ju0x6ElHnih7MJT6 / YUMISuyob9 /mbw8Vf49M7H2 t3AE5QIYcjqTwWJcwMlq5i9XfW2QLGH7K5i8 -----结束公钥-----

但结果总是一样的。签名无效。

在我的应用程序中,我正在使用这个 URls。

Request Azure Code Auth
https://login.microsoftonline.com/<Tenant_Id>/oauth2/v2.0/authorize?
client_id=xxxxxx12312xxxxxxxx
&response_type=code
&redirect_uri=http://localhost:8443/<AppName>/secure/aad
&response_mode=query
&scope=openid+profile+offline_access
&state=12345
&prompt=login

---- response ---
localhost:8443/msal4jsample/secure/aad?
code=0.AAAAe7KHdX9Z7oIAA
&amp;state=12345
&amp;session_state=716c6fa7-8b51-4025-98ef-489c3b25ab3d#

请求 Azure 令牌

发布方法

https://login.microsoftonline.com/common/oauth2/v2.0/token?
grant_type=authorization_code
&code=<Received from above azure code auth request>
&client_id=<Application_Id Registered in Azure>
&client_secret=<Secret Key>
&scope=openid profile email User.Read
&redirect_uri=http://localhost:8443/<MyApp>/secure/aad


---- Response ----

{
    "token_type": "Bearer",
    "scope": "openid profile User.Read email",
    "expires_in": 3599,
    "ext_expires_in": 3599,
    "access_token": "X1YmQ",
    "refresh_token": "PC6YMqqLpvm",
    "id_token": "Y86JentfTUzBQoiUzav3pAu3GIG3OhslQ"
}

为什么当我尝试检查 www.jwt.io 中的 "refresh_token": "PC6YMqqLpvm" 时签名无效。

拜托,你能告诉我我做错了什么吗?我需要指示 Azure 来签署访问令牌吗?

注意:我已使用本教程检查访问令牌的签名。 https://blogs.aaddevsup.xyz/2019/03/using-jwt-io-to-verify-the-signature-of-a-jwt-token/

亲切的问候, 马里奥·罗德里格斯

【问题讨论】:

  • 令牌是 MS Graph API 令牌吗?如果是,它们是特殊的,您无法验证它们。你不应该以任何方式验证他们的令牌,只需要为你的应用程序验证令牌。
  • 嗨@juunas,就我而言,我没有使用MS Graph API。我正在使用 MSAL App 示例生成令牌和 MS 网页作为参考。 docs.microsoft.com/en-us/azure/active-directory/develop/…

标签: java azure-active-directory jwt


【解决方案1】:

您正在为范围参数指定的 MS Graph API 请求访问令牌:scope=openid profile email User.Read。 User.Read 是一个 MS Graph API 范围。

这些令牌很特殊,您不应该验证它们。 以任何方式验证其他 API 的令牌不是您的应用程序的工作。 刷新令牌的相似之处在于您的应用无法验证它们。 它们只对身份提供者有意义。

您应该验证的唯一令牌是受众 (aud) 是您应用的客户端 ID 或应用 ID URI 的令牌。

【讨论】:

  • 嗨@junnas,首先,非常感谢您的帮助。我真的很感激。总而言之,我无法验证来自任何 Microsoft API 和 Refresh Token 的 Access_Token 的签名。我可以验证的唯一签名是 ID 令牌,其中包含令牌 ID 中的受众。我说的对吗?
  • 是的,ID 令牌和您为 API 获取的任何访问令牌。
猜你喜欢
  • 2021-01-21
  • 2017-12-15
  • 2018-01-01
  • 2011-10-25
  • 2022-09-27
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2019-04-10
相关资源
最近更新 更多