JWT认证机制

栏目: 编程工具 · 发布时间: 5年前

内容简介:session认证的流程一般如下:

1. 定义

Json web token (JWT) , 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519).该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录( SSO )场景。 JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。

2. 传统的Session认证

2.1 流程

session认证的流程一般如下:

  1. 用户向服务器发送用户名和密码。

  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。

  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

2.2 缺点

  • session保存在服务器,当注册用户很多,会增加服务器的开销。

  • 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,限制了负载均衡的能力。这也意味着限制了应用的扩展能力。

  • session是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造( CSRF )的攻击。

3.JWT认证

3.1 token

JWT 是基于 token 的鉴权机制类似于 http 协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于 token 认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

3.2 流程

  1. 用户使用用户名密码来请求服务器

  2. 服务器进行验证用户的信息

  3. 服务器通过验证发送给用户一个token

  4. 客户端存储token,并在每次请求时附送上这个token值

  5. 服务端验证token值,并返回数据

这个token必须要在每次请求时传递给服务端,它应该保存在 请求头 里, 另外,服务端要支持 CORS(跨来源资源共享) 策略,一般我们在服务端这么做就可以了 Access-Control-Allow-Origin: *

3.3 JWT构成

第一部分我们称它为头部( header ),第二部分我们称其为载荷( payload ),第三部分是签证( signature ).

官方链接jwt.io/

header

jwt的头部承载两部分信息:

  • 声明类型,这里是 jwt

  • 声明加密的算法 通常直接使用 SHA256

# 头部类似如下信息:{  "alg": "HS256",  "typ": "JWT"}复制代码

将头部进行 base64 加密(该加密是可以对称解密的),构成了第一部分.得到的加密信息是如下的一串字符串:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9复制代码

payload

载荷就是存放有效信息的地方。这些有效信息包含三个部分:

  • 标准中注册的声明

  • 公共的声明

  • 私有的声明

{  "name": "John",  "admin": true,  “email”:"xxx@gmail.com"}复制代码

该部分也是 base64 加密的,加密后得到下面字符串:

ewogICJuYW1lIjogIkpvaG4iLAogICJhZG1pbiI6IHRydWXvvIwKICDigJxlbWFpbOKAnToieHh4QGdtYWlsLmNvbSIKfQ复制代码

signature

JWT 的第三部分是一个签证信息,这个签证信息由三部分组成:

  • header ( base64 加密)

  • payload ( base64 加密)

  • secret 密钥

这个部分需要 base64 加密后的 headerbase64 加密后的 payload 使用 . 连接组成的字符串,然后通过 header 中声明的加密方式进行 SHA256 组合加密(不可逆加密),然后就构成了 jwt 的第三部分。将这三部分用 . 连接成一个完整的字符串,构成了最终的 jwt

注意: secret 是保存在服务器端的, jwt 的签发生成也是在服务器端的, secret 就是用来进行 jwt 的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret , 那就意味着客户端是可以自我签发 jwt 了。如果觉得密钥泄露了,请及时修改。

4. 后台设置

下面介绍的是在 djangorestframework 基础上的 jwt 集成方案。首先确保 djangorestframework 在设置文件中应用中注册。

安装

pip install djangorestframework-jwt复制代码

配置

INSTALLED_APPS = [
    ...
    'djangorestframework',
    ...
]
# 认证
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # JWT_EXPIRATION_DELTA 指明token的有效期
}复制代码

路由

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    # JWT 完成登录
    url(r'^authorizations/$', obtain_jwt_token),
]复制代码

利用 djangorestframework-jwt 生成的 token 值保存在浏览器的 Storage 中。

JWT认证机制


以上所述就是小编给大家介绍的《JWT认证机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何变得有思想

如何变得有思想

阮一峰 / 人民邮电出版社 / 2014-12-2 / 49.00元

本书为阮一峰博客选集,囊括了作者对各种问题的思考,围绕的主题是试图理解这个世界。本书内容非常广泛,涉及观点、文学、历史、科技、影视等方面。作者在书中对具有深刻意义的文字进行摘录,并且在思索后提出自己独特的观点。书后附有阮一峰诗集。 本书适合喜欢独立思考、热爱读书的读者,对于广大读者具有一定的启发作用。一起来看看 《如何变得有思想》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具