Python中关于JSON网络令牌的实例教程

编辑:光环大数据 来源: 时间: 2017-10-31 14:18 阅读:

  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培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服

你可能也喜欢这些

在线客服咨询

领取资料

X
立即免费领取

请准确填写您的信息

点击领取
#第三方统计代码(模版变量) '); })();
'); })();