我正在创建我自己的API服务器,我想使用OAuth2进行身份验证(使用我的Azure Active作为IDP)。
任何客户端(第一方或第三方)都可以连接到我的API,提供一个JWT。客户端将使用Azure AD (我自己的)进行身份验证,并将每个请求中从Azure AD获得的访问令牌传递给我的API服务器。API服务器应该验证附加在请求中的访问令牌的签名。
我很困惑如何验证JWT的签名。如果是RS256,是否应该获取公钥并对每个请求进行验证?(可能与缓存有关,以避免每次请求),但我觉得我正在使它复杂化。
在阅读@Ján Halaša的评论后,获得了更多的理解,并相应地更新了问题。
发布于 2018-02-05 11:24:48
有一个用于OpenID连接发现端点的RFC,它提供关于OAuth2和OpenId连接服务的元数据。Azure Active Directory 支持此端点。,但它是特定于租户的:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration返回的JSON文档包含jwks_uri属性,该属性包含一个可用于在JWK格式中获取AD公钥的URL。根据文献资料的说法,网址应该是
https://login.microsoftonline.com/common/discovery/v2.0/keys您应该能够从您想要验证的JWT中找到一个具有与kid (密钥标识符)值相同的kid值的密钥。密钥应该具有以下附加属性:kty: "RSA" (键类型)和use: "sig" (用于JWT签名)。
获得密钥后,只需解密正在验证的JWT的签名部分,并将其与从JWT的其他两个部分生成的散列进行比较(散列必须相同)。
您可以缓存JWK键,因为它的值不应该改变--如果有一个新键,它将得到一个新的唯一kid。可能唯一有问题的情况是,如果一个键从JWKS文档中删除,那么就取决于您缓存它的时间了。
https://stackoverflow.com/questions/48616182
复制相似问题