Python中关于JSON网络令牌的实例教程
Posted Python程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中关于JSON网络令牌的实例教程相关的知识,希望对你有一定的参考价值。
本文由Python部落(www.freelycode.com)组织翻译, 禁止转载, 欢迎转发
传统的网站用户认证模式是基于cookie认证的。在一个典型的REST架构中,服务器不保留任何客户状态。从安全角度来说,REST的无状态方式使会话session不合适。使用cookie来保证REST服务时,会话劫持和跨站点请求伪造是常见的安全问题。因此,他们需要验证和保护无状态的REST服务。
本文我们将学习使用JSON网络令牌来保护REST API。JSON网络令牌是一个开放的,表示双方安全的工业标准RFC7519 方法。JWT碰巧得到公司如Firebase,Google,Microsoft,和Zendesk的支持。
用一个比喻来理解
我们都有一张借记卡。插入一个自动取款机,就可以取钱。我的借记卡只能访问我的账户,并且一旦过期不能使用。JSON网络令牌也类似,你插入你的token到一个用户认证系统,获取属于你的受限的数据。
JWT的工作原理
使用JWT进行用户认证时,通常存储token到浏览器的本地存储或会话存储。退出时删除token就可以了。不用使别的无效。采用这种方法进行身份认证的好处之一是token不保存在数据库中,因此认证时不用查询任何会话存储。
在下面这个简单插图的帮助下,我们看看它-
JWT的结构
JSON网络令牌的例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tI iwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluI jp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWk iUzKELZ49eM7oWxAQK_ZXw
由.分成3个部分,每部分都是不同的。这3部分是:
头部
有效负载
签名
<base64编码的头部>.<base64编码的有效负载>.<base64编码的签名>
头部
JWT头部声明编码的对象是一个JSON网络令牌(JWT),并且该JWT是一个通过HMAC SHA-256签名的JWS。例如:
{
“alg”: “HS256”,
“typ”: “JWT”
}
“alg”是一个字符串,指定签名token的算法。
“type”是一个token的字符串,默认是“JWT”。指定这是一个JWT token。
有效负载(声明)
请求或负载可以被定义为一个声明,该声明关于包含安全信息以及额外的令牌本身元数据的一个实体。
以下是声明属性:
iss:创建令牌的主体
sub:令牌的主题
aud:令牌所适用的主体
qsh:查询字符串哈希值
exp:令牌过期时间,采用Unix时间
nbf:“Not before”时间,令牌生效的时间。 在这个时间之前JWT不接受处理。
iat:“Issued at”时间,采用Unix时间,令牌发行时间
jti: JWT ID 为JWT提供一个唯一标识符
签名
签名
紧接着是JSON网络签名标准,来生成最终的签名令牌。JWT头部和编码的声明联合起来,采用加密算法如HMAC SHA-256进行加密。服务器保留签名的私钥,所以它有能力核实存在的令牌。
流行的JWT库
Java atlassian-jwt 和 jsontoken
Python pyjwt
Node.js node-jwt-simple
Ruby ruby-jwt
php firebase php-jwt 和 luciferous jwt
.NET jwt
Haskell haskell-jwt
基于Token方法的优势
JWT 方法允许我们进行AJAX调用任何服务器或域。由于HTTP头是用来传输用户信息的。
没必要在服务器存储一个单独的session。JWT本身传达全部的信息。
服务器端减少到只是一个API和可以通过CDN服务的静态资源(html,CSS,JS)。
认证系统是手机兼容的,任何设备上可以生成令牌。
由于已经消除了cookie的需要,也不再需要保护跨站请求。
API密钥提供非此即彼的解决方案,然而JWT提供更颗粒度的控制,它可以用于任何调试目的的检查。
API密钥依赖于中央存储和服务。JWT可以自发行或者外部服务在允许的范围和期限发布它。
Python中创建一个JWT
编码有效负载
>>> import jwt
>>> encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'
服务器解码有效负载
>>> jwt.decode(encoded, 'secret', algorithms=['HS256'])
{'some': 'payload'}
希望这篇文章有帮助。请把你的想法评论出来。
英文原文: http://blog.apcelent.com/json-web-token-tutorial-example-python.html?utm_source=reddit.com
译者: 毛茸茸的向日葵
以上是关于Python中关于JSON网络令牌的实例教程的主要内容,如果未能解决你的问题,请参考以下文章
python 中关于 类变量, 实例变量, 静态方法,类方法,全局变量,局部变量的理解