金字塔的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.私钥