JWT实现过程及应用
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实现过程及应用的更多相关文章
- JWT使用过程中遇到的问题
1.创建token的盐设置过于简单,出现secret key byte array cannot be null or empty. 异常 解决方法:jwt:config:key:hwy ------ ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- Java Web Token - JWT
JWT认证过程:https://www.codetd.com/article/3602378 JWT官方文档:https://jwt.io/introduction/
- NET Core 1.1中使用Jwt
NET Core里Jwt的生成倒是不麻烦,就是要踩完坑才知道正确的生成姿势…… Jwt的结构 jwt的结构是{Header}.{Playload}.{Signature}三截.其中Header和Pla ...
- 关于Jwt的一些思考
在使用jwt的过程中发现了两个问题续期和退出的问题. 续期 因为jwt的token在签发之后是有过期时间的,所以就存在管理这个过期时间的问题.我看网上有提出解决方案的大致有下面几个 每次更新过期时间, ...
- SpringBoot集成JWT
JWT(json web tokens)是目前比较流行的跨域认证解决方案:说通俗点就是比较流行的token生成和校验的方案.碰巧公司有个app的项目的token采用了jwt方案,因此记录下后端 ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- spring boot rest 接口集成 spring security(2) - JWT配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
随机推荐
- 使用Azure Function玩转Serverless
Serverless&Azure Functions 通过无服务器计算,开发者无需管理基础结构,从而可以更快构建应用程序.通过无服务器应用程序,将由云服务提供商自动预配.缩放和管理运行代码所需 ...
- Lyndon words学习笔记
Lyndon words 定义: 对于一个字符串\(S\),若\(S\)的最小后缀是其本身,则\(S\)为一个\(lyndon\)串; 记为\(S\in L\); 即: \[S \in L \begi ...
- 图像sensor的bitdepth
参考来源:https://blog.csdn.net/yuejisuo1948/article/details/83617359 bitdepth目前个人理解是sensor像素上表示颜色的范围,也可说 ...
- CF149D Coloring Brackets
CF149D Coloring Brackets Link 题面: 给出一个配对的括号序列(如"\((())()\)"."\(()\)"等, "\() ...
- npm包管理器报错-npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/@XXX(over 30000ms)
由于这两天买的新电脑在短期内频频蓝屏.卡机,不得不把自己其他的本本拿出来换上,但是程序员换电脑是真的痛苦,其他不说就说一个配环境 真的折腾哈 我是一名前端菜鸟,现在自己的本本上使用的是npm包管理工具 ...
- 这个网易云JS解密,老网抑云看了都直呼内行
最近更新频率慢了,这不是因为CK3发售了嘛,一个字就是"肝".今天来看一下网易云音乐两个加密参数params和encSecKey,顺便抓取一波某歌单的粉丝,有入库哦,使用mysql ...
- ansible-playbook通过github拉取部署Lnmp环境
1. 配置服务器初始化 1.1) 关闭防火墙和selinux 1 [root@test-1 ~]# /bin/systemctl stop firewalld 2 [root@test-1 ~]# ...
- junit调试(No tests found matching )
使用junit调试程序时报错:initializationError(org.junit.runner.manipulation.Filter)java.lang.Exception: No test ...
- Swoole实时任务异步调用Demo
server.php <?php class Server { private $serv; private $logFilePath = "/data/wwwroot/houtai/ ...
- lua 1.0 源码分析 -- 2 内存回收
说这个,先要说下 lua 的环境,正常说创建一个 lua 的虚拟环境,就是创建一组全局变量, lua1.0 里创建的主要是以下几个: extern Symbol *lua_table; /* 符号数组 ...