jwt实现过程

# 用户登录,返回给客户端token(服务端不保存),用户带着token,服务端拿到token再校验;

1,提交用户名和密码给服务端,如果登陆成功,jwt会创建一个token,并返回;
第一段:header,内部包含 (算法/token类型)
{
"typ": "JWT", # 声明类型为jwt
"alg": "HS256" # 声明签名算法为SHA256
}
# json转化字符串做base64url加密,可反解
第二段:payload,包含(标准中注册的声明、公共声明、私有声明(用户信息))
{ # 私有声名
“id”: “12”,
“name”: “bajie″,
“exp”: 60 # 超时时间
}
# 公共声明:公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.
""" 注册的声明
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
"""
# json转化字符串做base64url加密,可反解
第三段:
1,将第一段和第二段的密文拼接
2,HS256加密 + 加盐
3,对HS256加密后的密文再用 base64url 加密
2,用户访问,需要携带token,后端进行校验
1,获取token
2,切割,对第二段解密,获取payload信息,检测是否超时
3,把第一段和第二段的密文拼接,再次执行HS256加密 + 加盐 得到 密文
4,密文 == token 匹配 (如果修改超时时间 则不通过)

  

jwt简单应用

安装: pip install pyjwt

import jwt
import datetime
from rest_framework.views import APIView
from rest_framework.response import Response
from jwt import exceptions from api import models class LoginAPIview(APIView):
def get(self, request, *args, **kwargs):
# 盐
sail = "sadjmasklfn63a5s62dwa@ddas/352asdfa"
"""
1,获取token
2,切割,对第二段解密,获取payload信息,检测是否超时
3,把第一段和第二段的密文拼接,再次执行HS256加密 + 加盐 得到 密文
4,密文 == token 匹配 (如果修改超时时间 则不通过)
"""
token = request.query_params.get("token")
verified_payload = None
msg = ''
try:
# 反解出来的第二段数据
verified_payload = jwt.decode(token, sail, True)
except exceptions.ExpiredSignatureError: # 超时
msg = "token失效"
except jwt.DecodeError:
msg = "token认证失败"
except jwt.InvalidTokenError:
msg = "非法token" if not verified_payload:
return Response({'code': '登录失败', "error": msg})
# print(verified_payload["id"],verified_payload["username"])
return Response({"ok": "登陆成功"}) def post(self, request, *args, **kwargs):
user = request.data.get('username')
pswd = request.data.get('password')
obj = models.UserInfo.objects.filter(username=user, password=pswd).first()
if obj:
# 盐
sail = "sadjmasklfn63a5s62dwa@ddas/352asdfa"
# 构造 第一段: header, 内部包含(算法 / token类型) 默认
headers = {
"typ": "JWT", # 声明类型为jwt
"alg": "HS256" # 声明签名算法为SHA256
}
# 第二段: payload, 包含(标准中注册的声明、公共声明、私有声明(用户信息))
payload = { # 私有声名
'id': obj.id,
'username': obj.username,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=1) # 超时时间1分钟
}
res_token = jwt.encode(headers=headers, payload=payload, key=sail, algorithm='HS256').decode('utf-8')
return Response({"msg": "登录成功", "token": res_token}) return Response("0")

  

JWT实现过程及应用的更多相关文章

  1. JWT使用过程中遇到的问题

    1.创建token的盐设置过于简单,出现secret key byte array cannot be null or empty. 异常 解决方法:jwt:config:key:hwy ------ ...

  2. JWT(JSON Web Token) 多网站的单点登录,放弃session

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  3. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  4. Java Web Token - JWT

    JWT认证过程:https://www.codetd.com/article/3602378 JWT官方文档:https://jwt.io/introduction/

  5. NET Core 1.1中使用Jwt

    NET Core里Jwt的生成倒是不麻烦,就是要踩完坑才知道正确的生成姿势…… Jwt的结构 jwt的结构是{Header}.{Playload}.{Signature}三截.其中Header和Pla ...

  6. 关于Jwt的一些思考

    在使用jwt的过程中发现了两个问题续期和退出的问题. 续期 因为jwt的token在签发之后是有过期时间的,所以就存在管理这个过期时间的问题.我看网上有提出解决方案的大致有下面几个 每次更新过期时间, ...

  7. SpringBoot集成JWT

        JWT(json web tokens)是目前比较流行的跨域认证解决方案:说通俗点就是比较流行的token生成和校验的方案.碰巧公司有个app的项目的token采用了jwt方案,因此记录下后端 ...

  8. JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  9. spring boot rest 接口集成 spring security(2) - JWT配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

随机推荐

  1. (转载)Altium Designer 17 (AD17)

    转载自:http://blog.csdn.net/qq_29350001/article/details/52199356 以前是使用DXP2004来画图的,后来转行.想来已经有一年半的时间没有画过了 ...

  2. 《Head First 设计模式》:代理模式

    正文 一.定义 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问. 要点: 代理模式为一个对象创建了代理对象,让代理对象控制对该对象的访问.被代理的对象可以是远程的对象.创建开销大的对象 ...

  3. Python-如何在一个for循环中迭代多个可迭代对象?

    案例: 某班学生期末考试成绩,语文.数学.英语分别存储在3个列表中,同时迭代三个列表.,计算每个学生的总分(并行) 某年级有4个班,某次英语成绩分别记录在4个列表中,依次迭代每个列表,统计全年级高于9 ...

  4. milvus和faiss安装及其使用教程

    写在前面 高性能向量检索库(milvus & faiss)简介 Milvus和Faiss都是高性能向量检索库,可以让你在海量向量库中快速检索到和目标向量最相似的若干个向量,这里相似度量标准可以 ...

  5. Java知识系统回顾整理01基础04操作符05赋值操作符

    一.赋值操作 赋值操作的操作顺序是从右到左 int i = 5+5; 首先进行5+5的运算,得到结果10,然后把10这个值,赋给i public class HelloWorld { public s ...

  6. windows 漏洞列表

    漏洞列表 #Security Bulletin   #KB     #Description    #Operating System CVE-2017-0213 [Windows COM Eleva ...

  7. C/C++常用头文件

    原文来源:https://blog.csdn.net/thisispan/article/details/7470335 无聊的时候可以多看看: C/C++头文件一览C#include <ass ...

  8. PADS Layout VX.2.3 将PCB中的元器件封装保存到库

    工具1:PADS Layout VX.2.3 菜单File > Library...,打开Library Manager,点击Create New Lib...新建一个库. 使用快捷键Ctrl ...

  9. Azure Cosmos DB (二) SQL API 操作

    一,引言 还记得国庆期间,我们学习了一下关于Azure Cosmos DB 的一些基础知识以及Azure Cosmos DB 的几种支持数据库类型.今天就开始分享一些实战操作,如何通过Azure Po ...

  10. ubuntu20 使用命令安装 mysql

    命令安装 mysql sudo apt-get update sudo apt-get install -y mysql-server mysql-client 查看 mysql 安装情况 servi ...