jwt 认证示意图

jwt 优势

1 没有数据库写操作,高效

2 服务器不存 token,低耗

3 签发检验都是算法,集群

jwt 认证算法:签发与检验

  1. jwt 三段式:头 . 体 . 签名 (head.payload.sgin)

  2. 头和体是可逆加密,让服务器可以反解除 user 对象,签名是不可逆加密,保证整个token的安全性的

  3. 头体签名三部分,都是采用 json 格式的字符串,进行加密,可逆加密一般采用 base64 算法,不可逆加密一般采用 hash(md5) 算法

  4. 头中的内容是基本信息:公司信息,项目组信息,token 采用的加密方式信息

    {
    "company": "公司信息",
    ...
    }
  5. 体中的内容是关键信息:用户主键,用户名,签发是客户端信息(设备号,地址),过期时间

    {
    "user_id": 1,
    ...
    }
  6. 签名中的内容是安全信息:头的加密结果 + 体的加密结果 + 服务器不对外公开的安全吗 进行 md5 加密

    {
    "head": "头的加密字符串",
    "payload": "体的加密字符串",
    "secret_key": "安全码"
    }

签发

根据登陆请求提交来的 账号 + 密码 + 设备信息 签发 token

  1. 用基本信息存储 json 字典,采用 base64 算法加密得到 头字符串
  2. 用关键信息存储 json 字典,采用 base64 算法加密得到 体字符串
  3. 用头、体加密字符串再加安全码信息存储 json 字典,采用 hash md5 算法加密得到 签名字符串

校验

根据客户端带 token 的请求,反解除 user 对象

  1. 将 token按“ . ”拆分为三段字符串,第一段头加密字符串,一般不需要做任何处理
  2. 第二段体加密字符串,要反解出用户主键,通过主键从 User 表中就能得到登陆用户,过期时间和设备信息都是安全信息,确保 token 没过期,且是同一设备来的
  3. 再用 第一段 + 第二段 + 服务器安全吗 不可逆 md5 加密,与第三段字符串进行碰撞校验,通过后才能代表第二段校验得到的 user 对象就是合法的登陆用户

drf 项目的 jwt 认证开发流程(重点)

  1. 用账号密码访问登陆接口,登陆接口逻辑中调用 签发 token 算法,得到 token,返回给客户端,客户端自己存到 cookies 中
  2. 校验 token 的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会校验,所以请求带来了 token,就会反解出 user 对象,在视图类中用 request.user 就能访问登陆的用户

注意:登陆接口需要做 认证 + 权限 两个局部禁用

drf-jwt 框架基本使用

安装

pip install djangorestframework-jwt

签发 token(登陆接口):视图类已经写好了,配置一下路由就行(urls.py)

# api/urls.py
from rest_framework_jwt.views import ObtainJSONWebToken
urlpatterns = [
# ...
url('^login/$', ObtainJSONWebToken.as_view()),
] # Postman请求:/api/login/,提供username和password即可

校验 token (认证组件):认证类已经写好了,全局配置一下组件就行了(settings.py)

# drf-jwt的配置
import datetime
JWT_AUTH = {
# 配置过期时间
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
} # drf配置(把配置放在最下方)
REST_FRAMEWORK = {
# 自定义三大认证配置类们
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
# 'DEFAULT_PERMISSION_CLASSES': [],
# 'DEFAULT_THROTTLE_CLASSES': [],
}

设置需要登陆才能访问的接口进行测试(views.py)

from rest_framework.permissions import IsAuthenticated
class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin):
# 设置必须登录才能访问的权限类
permission_classes = [IsAuthenticated, ] queryset = models.User.objects.filter(is_active=True).all()
serializer_class = serializers.UserCenterSerializer

测试访问登陆认证接口(Postman)

"""
1)用 {"username": "你的用户", "password": "你的密码"} 访问 /api/login/ 接口等到 token 字符串 2)在请求头用 Authorization 携带 "jwt 登录得到的token" 访问 /api/user/center/1/ 接口访问个人中心
"""

token 刷新机制(了解)

drf-jwt 直接提供刷新功能

"""
1)运用在像12306这样极少数安全性要求高的网站
2)第一个token由登录签发
3)之后的所有正常逻辑,都需要发送两次请求,第一次是刷新token的请求,第二次是正常逻辑的请求
"""

settings.py

import datetime

JWT_AUTH = {
# 配置过期时间
'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=5), # 是否可刷新
'JWT_ALLOW_REFRESH': True,
# 刷新过期时间
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

urls.py

from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
urlpatterns = [
url('^login/$', ObtainJSONWebToken.as_view()), # 登录签发token接口
url('^refresh/$', RefreshJSONWebToken.as_view()), # 刷新toekn接口
]

postman

# 接口:/api/refresh/
# 方法:post
# 数据:{"token": "登录签发的token"}

jwt 认证的更多相关文章

  1. 使用python实现后台系统的JWT认证(转)

    今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认 ...

  2. sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  3. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  4. Laravel 中使用 JWT 认证的 Restful API

    Laravel 中使用 JWT 认证的 Restful API 5天前/  678 /  3 / 更新于 3天前     在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...

  5. JWT 认证 以及Django 中的应用

    jwt 认证 私钥.公钥.CA认证 用一套加密规则 加密和解密 RSA加密 (非对称的加密) 摘要算法:MD5 FTP/互联网下载软件校验MD5 私钥 --RSA算法-->公钥 RSA原理 加密 ...

  6. asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)

    asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息.在这里我分享一个自定义 ...

  7. Asp.net Core认证和授权:JWT认证和授权

    JWT验证一般用户移动端,因为它不像cookie验证那样,没有授权跳转到登陆页面 JWT是json web token的简称,在  jwt.io 网址可以看到 新建一个API项目,通过postman ...

  8. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  9. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  10. WebApi使用JWT认证(一)

    这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...

随机推荐

  1. ECMAScript中的箭头函数 (=>) 使用注意事项

    箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target.这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数. 箭 ...

  2. C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。

    //统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...

  3. Net Core解决ZipFile解压中文出现乱码

    一.在main方法中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 二.解压添加 //sourceArchiveFi ...

  4. @Value注解的使用

    前提它需要在spring 管理的Bean中有效 (如@Service...) #{...} 此方式可以使用 SpEL 表达式如 #{30-15} ${...} 可以获取配置文件中的值 如 ${jwt. ...

  5. JQuery选择器&过滤器

    JQuery对象: JQuery对象的本质上是DOM数组,它对DOM元素进行了封装 JQuery对象和JavaScript对象可以互转(\$()/$obj()[i]),但是JQuery对象和Javas ...

  6. leetcode 0209

    目录 ✅ 500. 键盘行 描述 解答 ✅ 905. 按奇偶排序数组 描述 解答 py sorted 参数详解 ✅ 559. N叉树的最大深度 描述 解答 java dfs-like method(r ...

  7. 请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是

    请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是 ServiceBase的子类. static void Main() { ServiceBase[] ...

  8. [Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)

    Shader Graph Error  : The current render pipeline is not compatible with this master node 问题产生环境: Un ...

  9. dense向量和稀疏向量sparse

    import org.apache.spark.mllib.linalg.Vectors object Test { def main(args: Array[String]) { val vd = ...

  10. Kali 2020.1 默认密码不是toor

    官方2020年一月28日的文章中指出root/toor is dead. Long live kali/kali. 登录用户名和密码是kali:kali 但是虚拟机镜像下载页面没有及时更新,仍然提示登 ...