Oauth 2.0 OAuth2 API认证/授权

Oauth 2.0 OAuth2 API认证/授权,oauth-2.0,jwt,openid-connect,Oauth 2.0,Jwt,Openid Connect,我正在创建我自己的API服务器,我希望使用OAuth2(使用我的Azure Active Directory作为IDP)对其进行身份验证 任何客户机(第一方或第三方)都可以通过JWT连接到我的API。客户端将使用Azure AD(我拥有)进行身份验证,并将在每个请求中从Azure AD获得的访问令牌传递给我的API服务器。API服务器应该验证请求中附加的访问令牌的签名 我不知道如何验证JWT的签名。如果是RS256,我是否应该获取公钥并对每个请求进行验证?(可能是使用缓存来避免每次请求)但我觉得

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

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

我不知道如何验证JWT的签名。如果是RS256,我是否应该获取公钥并对每个请求进行验证?(可能是使用缓存来避免每次请求)但我觉得这让事情复杂化了

[在阅读@Ján Halaša的评论后获得了更多的理解,并相应地更新了问题]

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

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
返回的JSON文档包含
jwks_uri
属性,该属性包含可用于获取广告公钥的URL。根据,URL应该是

https://login.microsoftonline.com/common/discovery/v2.0/keys
您应该能够从您想要验证的JWT中找到与
kid
值相同的
kid
值的密钥。密钥应具有以下附加属性
kty:“RSA”
(密钥类型)和
use:“sig”
(用于JWT签名)

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


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

您是想创建多个身份验证提供程序,还是只创建自己的身份验证提供程序?这里的秘密是指共享密钥HS256还是RS256签名的公钥?@JánHalaša-更新了问题-我想使用我自己的提供商并想使用RS256公钥进行验证谢谢@Ján Halaša-这确实有助于回答我的问题。不过,一个简单的问题是——我没有找到很多使用公钥验证令牌签名的示例或良好模式,只是想知道我是否遗漏了什么——这是我开发资源服务器和依赖第三方IDP时唯一的方法吗?JWT通常用于OpenId Connect的ID令牌。因此,您可以在有关OpenId Connect的文档中找到此RSA密钥分发。OAuth2访问令牌通常以随机字符串的形式出现,需要在
/token
端点进行验证,这允许身份验证提供商(Azure AD)撤销令牌。但是在阅读本文时,您可能正在使用ID标记。