未提供项目说明

starlette-oauth2-api的Python项目详细描述


pipeline statuscoverage report

星光大道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密钥,则将忽略它。这是因为需要访问令牌来解码它,而我们无权访问它。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何使用Java代码从包含嵌套数据的Json数组中获取值   java休眠每个实体两个表   java用新行合并两个字符串   JavaGuice是否对特定实例使用注入?   java仅为安装程序和应用程序将jre嵌入WInrun4j一次   在JAVA usng Gson中解析JSON   在Java中一次遍历二叉树就能得到树的最小高度和最大高度?   按子列表中的项对Java列表进行排序   java如何使用SpringJPA存储库正确保存带有外键的对象?   java Eclipse OSGI未满足的约束   滑动菜单库的java问题   java在推断具有整数基数约束的实例时遇到的问题   java如何通过Spring Boot/Tomcat发送带有GET参数的json?   java无法解析AndroidWeetSheet库的依赖项   使用RESTAPI上载到Azure Blob存储时,java Zip存档文件会损坏   java如何在单击JButton时使用swing创建新窗口   java如何从数据库中获取序列的下一个值,并使用oracle 10g在netbeans的JOptionPane中显示它?   java Android从值中获取字符串资源Id   java在maven中将jar添加到部署程序集中的等价物是什么