Python中关于JSON网络令牌的实例教程
Python中关于JSON网络令牌的实例教程,传统的网站用户认证模式是基于cookie认证的。在一个典型的REST架构中,服务器不保留任何客户状态。从安全角度来说,REST的无状态方式使会话session不合适。使用cookie来保证REST服务时,会话劫持和跨站点请求伪造是常见的安全问题。因此,他们需要验证和保护无状态的REST服务。
本文我们将学习使用JSON网络令牌来保护RESTAPI。JSON网络令牌是一个开放的,表示双方安全的工业标准RFC7519方法。JWT碰巧得到公司如Firebase,Google,Microsoft,和Zendesk的支持。
用一个比喻来理解
我们都有一张借记卡。插入一个自动取款机,就可以取钱。我的借记卡只能访问我的账户,并且一旦过期不能使用。JSON网络令牌也类似,你插入你的token到一个用户认证系统,获取属于你的受限的数据。
JWT的工作原理
使用JWT进行用户认证时,通常存储token到浏览器的本地存储或会话存储。退出时删除token就可以了。不用使别的无效。采用这种方法进行身份认证的好处之一是token不保存在数据库中,因此认证时不用查询任何会话存储。
JWT的结构
JSON网络令牌的例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
由.分成3个部分,每部分都是不同的。这3部分是:
头部
有效负载
签名
<base64编码的头部>.<base64编码的有效负载>.<base64编码的签名>
头部
JWT头部声明编码的对象是一个JSON网络令牌(JWT),并且该JWT是一个通过HMACSHA-256签名的JWS。例如:
{
“alg”:“HS256”,
“typ”:“JWT”
}
“alg”是一个字符串,指定签名token的算法。
“type”是一个token的字符串,默认是“JWT”。指定这是一个JWTtoken。
有效负载(声明)
请求或负载可以被定义为一个声明,该声明关于包含安全信息以及额外的令牌本身元数据的一个实体。
以下是声明属性:
iss:创建令牌的主体
sub:令牌的主题
aud:令牌所适用的主体
qsh:查询字符串哈希值
exp:令牌过期时间,采用Unix时间
nbf:“Notbefore”时间,令牌生效的时间。在这个时间之前JWT不接受处理。
iat:“Issuedat”时间,采用Unix时间,令牌发行时间
jti:JWTID为JWT提供一个唯一标识符
签名
签名
紧接着是JSON网络签名标准,来生成最终的签名令牌。JWT头部和编码的声明联合起来,采用加密算法如HMACSHA-256进行加密。服务器保留签名的私钥,所以它有能力核实存在的令牌。
流行的JWT库
Javaatlassian-jwt和jsontoken
Pythonpyjwt
Node.jsnode-jwt-simple
Rubyruby-jwt
PHPfirebasephp-jwt和luciferousjwt
.NETjwt
Haskellhaskell-jwt
基于Token方法的优势
JWT方法允许我们进行AJAX调用任何服务器或域。由于HTTP头是用来传输用户信息的。
没必要在服务器存储一个单独的session。JWT本身传达全部的信息。
服务器端减少到只是一个API和可以通过CDN服务的静态资源(HTML,CSS,JS)。
认证系统是手机兼容的,任何设备上可以生成令牌。
由于已经消除了cookie的需要,也不再需要保护跨站请求。
API密钥提供非此即彼的解决方案,然而JWT提供更颗粒度的控制,它可以用于任何调试目的的检查。
API密钥依赖于中央存储和服务。JWT可以自发行或者外部服务在允许的范围和期限发布它。
Python中创建一个JWT
编码有效负载
>>>importjwt
>>>encoded=jwt.encode({'some':'payload'},'secret',algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'
服务器解码有效负载
>>>jwt.decode(encoded,'secret',algorithms=['HS256'])
{'some':'payload'}
希望这篇文章有帮助。请把你的想法评论出来。
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!