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 ...
随机推荐
- SpringCloud Alibaba系列(三) Sentinel热点参数限流
愿你生命中有够多的云翳,造就一个美好的黄昏 欢迎关注公众号[渣男小四],一个喜欢技术更喜欢艺术的青年 一.介绍 热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据 ...
- 我把这个贼好用的Excel导出工具开源了!!
写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...
- 生成器generator和迭代器Iterator
一.列表生成式 在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式.什么意思?举个例子,如果想生成列表[0,1,2 ...
- 温故知新————c++ 多态
参考: 1. https://blog.csdn.net/weixin_42678507/article/details/89414998 (直接说明原理) 2 .https://www.cnblo ...
- VueCroppie
下载 VueCroppie VueCroppie是一个Vue 2包装Croppie一个美丽的照片裁剪工具的Javascript由foliotek. 安装 NPM 安装vue-croppie-保存 CD ...
- Python 的映射数据类型有哪些?零基础小白入门学习必看
1 映射类关系 Python 的 collections.abc 模块内拥有 Mapping 和 MutableMapping 这两个抽象基类,它们为 dict 和其他类似的类型提供了接口定义. mu ...
- golang API 请求队列
概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...
- 2017-01-26--编译busybox总结
错误一: ox@ubuntu:busybox-1.16.0$ make menuconfig Makefile:431: *** mixed implicit and normal rules: de ...
- 测试AAA
程序计数器(线程私有) 程序计数器(Program Counter Register),也有称作为 PC 寄存器.保存的是程序当 前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当 ...
- IDEA项目路径初探
IDEA项目路径 普通Java项目 普通Java项目,标准目录结构src下的路径就是classpath类路径,每次编译都会将src目录下新增的类和资源文件打包进类路径. 如下图,类文件和配置文件都会被 ...