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 中关于 类变量, 实例变量, 静态方法,类方法,全局变量,局部变量的理解

独家 | 手把手教你使用OpenCV库(附实例Python代码解析)

python中关于发邮件的示例

Js中关于内部方法实例方法原型方法静态方法的个人见解。

Python入门篇

Json 映射异常无法从 START_ARRAY 令牌中反序列化实例