未提供项目说明
starlette-oauth2-api的Python项目详细描述
星光大道2号
通过JWT进行身份验证和授权的Starlette中间件。在
此中间件旨在通过外部认证提供商(如Microsoft AD、Auth0)提供的访问令牌向API(如FastAPI)添加身份验证和授权。 它的主要用例是当您有一个依赖于外部身份提供者进行身份验证和授权的API,并且其客户端可以自己请求访问令牌。在这种情况下,API不需要与标识提供者通信—它只需要验证访问令牌是否由标识提供者签名。在
这个中间件只依赖于python-jose
,它使用它来解码和验证jwt。在
如何安装
pip install starlette-oauth2-api
如何使用
下面是如何使用此中间件的示例:
^{pr2}$此时,除了/
之外的每个路由都需要authorization: Bearer {token}
,其中token
必须:
- 成为JWT
- 由
issuer
发给观众audience
- 由
https://www.googleapis.com/oauth2/v3/certs
中的一个密钥签名 - 尚未过期
如果上面的任何条件都失败,则返回401响应,如果不包含带有Bearer
的头,则返回400响应。在
当请求有效时,Middlware将JWT中的所有声明添加到oauth2-claims
,可以使用
...
def home(request):
...
request.scope['oauth2-claims']
...
特别是,如果您的身份提供程序提供自定义声明,则可以使用这些声明进行授权。在
细节
参数providers
必须是键是任意的字典,其值必须是包含三个键的字典:
issuer
audience
keys
发行人(iss)
这个中间件使用发行者(由pythonjose)验证令牌是由特定实体发出的。发行人示例:
- 微软:
https://login.microsoftonline.com/<ad_tenant_id>/v2.0
- 谷歌:
https://accounts.google.com
这个值可以在https://.../.well-known/openid-configuration
,键iss
找到。在
观众(澳元)
与颁发者一样,此中间件使用访问群体来验证令牌是否用于此API。 一些观众的例子:
- 微软:
https://<app-name>.azurewebsites.net
- 谷歌:
<tenant>-<project>.apps.googleusercontent.com
在AD中配置应用程序时,可以找到此值,这取决于特定的标识 您使用的提供程序。在
键(jwks)
keys
对应于标识提供者的公钥,其对应的(私有)对应方用于对令牌进行签名。此中间件依赖于pythonjose来验证令牌是否由该字段的对应密钥签名。在
keys
可以是另一个对象的URL。当它是一个URL时,这个中间件从中获取密钥。示例:
- 微软:
https://login.microsoftonline.com/<tenant-id>/discovery/v2.0/keys
- 谷歌:
https://www.googleapis.com/oauth2/v3/certs
这个URL可以在https://.../.well-known/openid-configuration
,键jwks_uri
找到。在
当keys
是另一个对象时,它表示JWK、根据rfc7517设置的JWK,或者pythonjose接受的其他(非标准)变体。其内容示例:
{'keys': [
{
"kid": "...",
"e": "AQAB",
"kty": "RSA",
"alg": "RS256",
"n": "...",
"use": "sig"
},
]}
提供JWK集或url之间的权衡如下:一方面,如果提供JWK集,则该中间件不需要访问公共互联网来验证令牌,因此可以部署在没有JWK集的环境中。另一方面,JWK最终由 身份提供程序和您将使用各自更新的公钥重新部署应用程序。在
解码
用上面解释的密钥验证签名。如果令牌在其有效负载中携带一个at_hash
密钥,则将忽略它。这是因为需要访问令牌来解码它,而我们无权访问它。在
- 项目
标签: