金字塔的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第三方库


热门话题
servlet控制器中的java空指针异常   java部署Maven项目无法添加jersey原型   Java邮件跳回了邮件的地址   java Android Studio:尝试调用虚拟方法“void Android”。小装置。图像按钮。空对象引用上的setImageResource(int)“”   java如何在服务中使用倒计时更新文本   java如果没有更多的异常,我如何停止获取输入?   java将页码放入文档中   名为[<name>]的java hibernate参数不存在   java如何在JTextPane中动态生成新行?   java LinkedList对“get()”使用迭代器以加快迭代速度   java Junit 4.12问题测试异常   rest密钥斗篷从Java导入领域“创建”?   如何并行执行oracle java存储过程   java如何保存用户上次读取的页码   java操作系统。getSystemCpuLoad()始终返回相同的值