金字塔的jwt认证策略

pyramid_jwt的Python项目详细描述


金字塔的JWT身份验证

此包使用json为金字塔实现身份验证策略。 网络令牌。此标准( rfc7519 )通常用于保护backens api。 优秀的库是 用于JWT编码/解码逻辑。

在金字塔应用程序中启用jwt支持非常简单:

frompyramid.configimportConfiguratorfrompyramid.authorizationimportACLAuthorizationPolicydefmain():config=Configurator()# Pyramid requires an authorization policy to be active.config.set_authorization_policy(ACLAuthorizationPolicy())# Enable JWT authentication.config.include('pyramid_jwt')config.set_jwt_authentication_policy('secret')

这将使用 authorization http头设置jwt身份验证策略 使用 jwt 方案检索令牌。使用另一个http头很简单:

config.set_jwt_authentication_policy('secret',http_header='X-My-Header')

如果您的应用程序需要解码包含 观众 声明您可以使用:

config.set_jwt_authentication_policy('secret',auth_type='Bearer',callback=add_role_principals,audience="example.org")

为了简化有效令牌的创建,一个新的方法是 添加到请求中。您可以在视图中使用它来创建令牌。简单的 rest后端的身份验证视图可能如下所示:

@view_config('login',request_method='POST',renderer='json')deflogin(request):login=request.POST['login']password=request.POST['password']user_id=authenticate(login,password)# You will need to implement this.ifuser_id:return{'result':'ok','token':request.create_jwt_token(user_id)}else:return{'result':'error'}

由于jwt通常通过http头使用,并且不使用cookies, 来自金字塔的标准 remember() forget() 函数不起作用。 在启用JWT身份验证时尝试使用它们将导致警告。

额外索赔

通常金字塔只提出一个jwt声明:主题 (或 sub claim)设置为主体。您还可以在 通过将关键字参数传递到 create\u jwt\u token 方法进行标记。

token=request.create_jwt_token(user.id,name=user.name,admin=(user.role=='admin'))

在jwt令牌中找到的所有声明都可以通过jwt声明访问。 请求的字典属性。对于上面的示例,您可以检索 直接来自请求的用户的名称和管理状态:

print('User id: %d'%request.authenticated_userid)print('Users name: %s',request.jwt_claims['name'])ifrequest.jwt_claims['admin']:print('This user is an admin!')

请记住,jwt_索赔的数据仅反映jwt的索赔 令牌,不检查用户是否有效:为 身份验证策略未选中。因此你应该经常使用 请求。已验证的用户id 而不是请求。jwt_声明['sub']

您还可以使用额外的声明为用户管理额外的主体。例如 您可以声明表示为用户添加组成员身份或角色。这个 需要两个步骤:首先向jwt令牌添加额外的声明,如上图所示, 然后使用身份验证策略的回调挂钩来转换额外的声明 成为校长。下面是一个简单的示例:

defadd_role_principals(userid,request):return['role:%s'%roleforroleinrequest.jwt_claims.get('roles',[])]config.set_jwt_authentication_policy(callback=add_role_principals)

然后可以在acl中使用角色主体:

classMyView:__acl__=[(Allow,Everyone,['read']),(Allow,'role:admin',['create','update']),]

验证示例

在使用 创建jwt_令牌 您可以通过发出http授权头类型进行测试 对于JWT,

GET /resource HTTP/1.1
Host: server.example.com
Authorization: JWT eyJhbGciOiJIUzI1NiIXVCJ9...TJVA95OrM7E20RMHrHDcEfxjoYZgeFONFh7HgQ

我们可以使用旋度进行测试。

frompyramid.configimportConfiguratorfrompyramid.authorizationimportACLAuthorizationPolicydefmain():config=Configurator()# Pyramid requires an authorization policy to be active.config.set_authorization_policy(ACLAuthorizationPolicy())# Enable JWT authentication.config.include('pyramid_jwt')config.set_jwt_authentication_policy('secret')
0
frompyramid.configimportConfiguratorfrompyramid.authorizationimportACLAuthorizationPolicydefmain():config=Configurator()# Pyramid requires an authorization policy to be active.config.set_authorization_policy(ACLAuthorizationPolicy())# Enable JWT authentication.config.include('pyramid_jwt')config.set_jwt_authentication_policy('secret')
1

设置

有许多标志指定如何创建和验证令牌。 您可以在.ini文件中设置此项,或者直接将其传递/重写到 config.set_jwt_authentication_policy() 函数。

<表> < COLGROUP > < COL/> < COL/> < COL/> < COL/> <广告> 参数 ini文件项 默认值 说明 < /广告> <正文> 私钥 Jwt.私钥 > 用于散列或签名令牌的密钥。 公共密钥 jwt.公共密钥 > 用于验证令牌签名的密钥。只有 用于非等深线算法。 算法 jwt.算法 HS512 哈希或加密算法 到期 jwt.到期日 > 秒数ds(或datetime.timedelta 实例)在令牌过期之前。 观众 jwt.观众 > 代币的拟议观众 回旋余地 jwt.余地 < 0 > < > > 令牌允许的秒数 在拒绝之前过期。 HTTP U头 jwt.http_头 授权 用于令牌的http头 验证类型 jwt.auth_类型 JWT 授权中使用的身份验证类型 标题。不用于其他HTTP头。 json编码器 > 无 要使用的jsonencoder的一个子类 对委托人和索赔信息进行编码。 < > <表>

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

推荐PyPI第三方库


热门话题
java未从Facebook OAuth接收名字、姓氏和姓氏   我自己代码中的java ConcurrentModificationException   java在Android上获得单像素TIFF图像   java图形输出中的swing集成弹出窗口“通知”   将数据库表中的所有数据集插入jTable Java   java如何使用Hibernate获取不完整的集合?   打印无法从java连接到打印机   java使用分隔符拆分带引号的字符串   java Axis2禁用严格验证(wsdl2java中的Eosv)允许什么,如何使其更加严格?   java有人能帮我处理循环代码吗   java将JsonObject数组转换为整数   JavaXWiki扩展:检测事件空间创建   java如何设置图表的文本方向以使用poi旋转所有文本?   eche RecyclerView项的java Set自定义字体   java单元测试带有私有构造函数的spring组件,无需注入   用户界面如何在java中动态显示一组多个元素?   如何从java应用程序调用IDL(交互式数据语言)?   Java的内置库实现