API

时间:2018-02-05 05:09:07

标签: oauth-2.0 jwt openid-connect

我正在创建自己的API服务器,我想使用OAuth2进行身份验证(使用我的Azure Active Directory作为IDP)。

任何客户(第一方或第三方)都可以连接到提供JWT的API。客户端将使用Azure AD(我拥有)进行身份验证,并将每个请求中从Azure AD获取的访问令牌传递给我的API服务器。 API服务器应验证请求中附加的访问令牌的签名。

我很困惑如何验证JWT的签名。如果它是RS256,我应该获取公钥并在每个请求上验证吗? (可能有缓存以避免每次请求)但我觉得我使它复杂化。

[阅读@JánHaraša的评论后得到更多理解并相应更新了问题]

1 个答案:

答案 0 :(得分:1)

有一个OpenID Connect discovery端点的RFC,它提供有关OAuth2和OpenId Connect服务的元数据。 Azure Active Directory supports this endpoint,但它是特定于租户的:

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration

返回的JSON文档包含jwks_uri属性,该属性包含可用于在JWK format中获取AD公钥的URL。根据{{​​3}},网址应为

https://login.microsoftonline.com/common/discovery/v2.0/keys

您应该能够找到具有与您想要验证的JWT中的kid值相同的kid(密钥标识符)值的密钥。密钥应具有以下附加属性kty: "RSA"(密钥类型)和use: "sig"(用于JWT签名)。

获得密钥后,您只需解密正在验证的JWT的签名部分,并将其与JWT其他两部分的哈希值进行比较(哈希值必须相同)。

您可以缓存JWK密钥,因为它的值不应该更改 - 如果有新密钥,它将获得一个新的唯一kid。可能唯一有问题的情况是,如果从JWKS文档中删除了一个密钥,那么由您来缓存它需要多长时间。