Microsoft 标识平台中的 ID 令牌
ID 令牌是一种安全令牌,可充当身份验证证明,用于确认已成功验证用户的身份。 借助 ID 令牌中的信息,客户端能够验证用户是否为其声明的身份,这类似于会议中使用的姓名标签。 ID 令牌由授权服务器颁发,其中包含的声明携带了有关用户的信息。 它们可以与访问令牌一起发送,也可以代替访问令牌来发送,并且始终采用 JWT(JSON Web 令牌)格式。
ID 令牌不同于访问令牌,后者用于充当授权证明。 机密客户端应验证 ID 令牌。 不应使用 ID 令牌来调用 API。
第三方应用程序应理解 ID 令牌。 ID 令牌不得用于授权目的。 访问令牌用于授权。 ID 令牌提供的声明可以用于应用程序内部的用户体验、作为数据库中的键以及提供客户端应用程序访问权限。 有关 ID 令牌中使用的声明的详细信息,请参阅 ID 令牌声明参考。 有关基于声明的授权的详细信息,请参阅通过验证声明保护应用程序和 API。
令牌格式
Microsoft 标识平台提供了两个版本的 ID 令牌:v1.0 和 v2.0。 这些版本确定令牌中的声明。 v1.0 和 v2.0 ID 令牌所携带的信息有所不同。 版本基于终结点,从该终结点处其接受请求。 新应用程序应使用 v2.0。
- v1.0:
https://login.partner.microsoftonline.cn/common/oauth2/authorize
- v2.0:
https://login.partner.microsoftonline.cn/common/oauth2/v2.0/authorize
示例 v1.0 ID 令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjdfWnVmMXR2a3dMeFlhSFMzcTZsVWpVWUlHdyIsImtpZCI6IjdfWnVmMXR2a3dMeFlhSFMzcTZsVWpVWUlHdyJ9.eyJhdWQiOiJiMTRhNzUwNS05NmU5LTQ5MjctOTFlOC0wNjAxZDBmYzljYWEiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9mYTE1ZDY5Mi1lOWM3LTQ0NjAtYTc0My0yOWYyOTU2ZmQ0MjkvIiwiaWF0IjoxNTM2Mjc1MTI0LCJuYmYiOjE1MzYyNzUxMjQsImV4cCI6MTUzNjI3OTAyNCwiYWlvIjoiQVhRQWkvOElBQUFBcXhzdUIrUjREMnJGUXFPRVRPNFlkWGJMRDlrWjh4ZlhhZGVBTTBRMk5rTlQ1aXpmZzN1d2JXU1hodVNTajZVVDVoeTJENldxQXBCNWpLQTZaZ1o5ay9TVTI3dVY5Y2V0WGZMT3RwTnR0Z2s1RGNCdGsrTExzdHovSmcrZ1lSbXY5YlVVNFhscGhUYzZDODZKbWoxRkN3PT0iLCJhbXIiOlsicnNhIl0sImVtYWlsIjoiYWJlbGlAbWljcm9zb2Z0LmNvbSIsImZhbWlseV9uYW1lIjoiTGluY29sbiIsImdpdmVuX25hbWUiOiJBYmUiLCJpZHAiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcvIiwiaXBhZGRyIjoiMTMxLjEwNy4yMjIuMjIiLCJuYW1lIjoiYWJlbGkiLCJub25jZSI6IjEyMzUyMyIsIm9pZCI6IjA1ODMzYjZiLWFhMWQtNDJkNC05ZWMwLTFiMmJiOTE5NDQzOCIsInJoIjoiSSIsInN1YiI6IjVfSjlyU3NzOC1qdnRfSWN1NnVlUk5MOHhYYjhMRjRGc2dfS29vQzJSSlEiLCJ0aWQiOiJmYTE1ZDY5Mi1lOWM3LTQ0NjAtYTc0My0yOWYyOTU2ZmQ0MjkiLCJ1bmlxdWVfbmFtZSI6IkFiZUxpQG1pY3Jvc29mdC5jb20iLCJ1dGkiOiJMeGVfNDZHcVRrT3BHU2ZUbG40RUFBIiwidmVyIjoiMS4wIn0=.UJQrCA6qn2bXq57qzGX_-D3HcPHqBMOKDPx4su1yKRLNErVD8xkxJLNLVRdASHqEcpyDctbdHccu6DPpkq5f0ibcaQFhejQNcABidJCTz0Bb2AbdUCTqAzdt9pdgQvMBnVH1xk3SCM6d4BbT4BkLLj10ZLasX7vRknaSjE_C5DI7Fg4WrZPwOhII1dB0HEZ_qpNaYXEiy-o94UJ94zCr07GgrqMsfYQqFR7kn-mn68AjvLcgwSfZvyR_yIK75S_K37vC3QryQ7cNoafDe9upql_6pB2ybMVlgWPs_DmbJ8g0om-sPlwyn74Cc1tW3ze-Xptw_2uVdPgWyqfuWAfq6Q
在 jwt.ms 中查看此 v1.0 示例令牌。
示例 v2.0 ID 令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMVE16YWtpaGlSbGFfOHoyQkVKVlhlV01xbyJ9.eyJ2ZXIiOiIyLjAiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vOTEyMjA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkL3YyLjAiLCJzdWIiOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFJa3pxRlZyU2FTYUZIeTc4MmJidGFRIiwiYXVkIjoiNmNiMDQwMTgtYTNmNS00NmE3LWI5OTUtOTQwYzc4ZjVhZWYzIiwiZXhwIjoxNTM2MzYxNDExLCJpYXQiOjE1MzYyNzQ3MTEsIm5iZiI6MTUzNjI3NDcxMSwibmFtZSI6IkFiZSBMaW5jb2xuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiQWJlTGlAbWljcm9zb2Z0LmNvbSIsIm9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC02NmYzLTMzMzJlY2E3ZWE4MSIsInRpZCI6IjkxMjIwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsIm5vbmNlIjoiMTIzNTIzIiwiYWlvIjoiRGYyVVZYTDFpeCFsTUNXTVNPSkJjRmF0emNHZnZGR2hqS3Y4cTVnMHg3MzJkUjVNQjVCaXN2R1FPN1lXQnlqZDhpUURMcSFlR2JJRGFreXA1bW5PcmNkcUhlWVNubHRlcFFtUnA2QUlaOGpZIn0.1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw
在 jwt.ms 中查看此 v2.0 示例令牌。
令牌生存期
默认情况下,ID 令牌的有效期为 1 小时 - 1 小时后,客户端必须获取新的 ID 令牌。
可以调整 ID 令牌的生存期,控制客户端应用程序使应用程序会话过期的频率,以及要求用户再次进行身份验证(以无提示方式或交互方式)的频率。 有关详细信息,请参阅可配置的令牌生存期。
验证令牌
要验证 ID 令牌,客户端可以检查令牌是否已被篡改。 它还可以验证证书颁发者,以确保正确的证书颁发者已发送回令牌。 由于 ID 令牌始终是 JWT 令牌,因此可以使用许多现有的库来验证这些令牌 - 建议使用其中的一个库来验证,而不要自行进行验证。 只有机密客户端才应验证 ID 令牌。 有关详细信息,请参阅通过验证声明保护应用程序和 API。
公共应用程序(代码完全在不控制的设备或网络上运行,如用户的浏览器或家庭网络)不受益于验证 ID 令牌。 进行验证时,恶意用户可以截获并编辑用于验证令牌的密钥。
验证令牌上的签名后,应在 ID 令牌中验证以下 JWT 声明。 令牌验证库还可以验证以下声明:
- 时间戳:
iat
、nbf
和exp
时间戳全都应位于当前时间之前或之后(具体取决于需要)。 - 受众:
aud
声明应该与应用程序的应用 ID 匹配。 - Nonce:有效负载中的
nonce
声明必须与进行初始请求时传递到/authorize
终结点中的 nonce 参数匹配。