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 ...
随机推荐
- Spark中的聚类算法
Spark - Clustering 官方文档:https://spark.apache.org/docs/2.2.0/ml-clustering.html 这部分介绍MLlib中的聚类算法: 目录: ...
- Codeforces Round #672 (Div. 2) A - C1题解
[Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...
- 2、JVM的内存
1.JVM中的内存结构 从OS的角度来看,JVM运行时会把一部分内存虚拟机化,所以把内存分为直接内存(未被虚拟机化的内存)和运行时数据区(被虚拟机化的内存) JVM的运行时数据区若从线程的角度来看,可 ...
- 如何让百度网盘下载速度达60MB/s!
(软件下载方式在文末) 自从 PanDownload 被处理之后 一直没有超越它的可替代的应用出来 但是最近,竟然有人接盘了!重新制作上线 推出了更加强劲的复活版! 放张图,大家先感受下 60MB/s ...
- python单元测试框架pytest
首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结. 这篇博客准备讲解一下pytest测试框架,这个框架是当前最流行的python ...
- Docker入门手册
20.Docker 20.1 Docker的起源 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司,这家公司主要提供基于PaaS的云计算技术服务 ...
- spring-boot-route(十一)数据库配置信息加密
Spring Boot最大的特点就是自动配置了,大大的减少了传统Spring框架的繁琐配置,通过几行简单的配置就可以完成其他组件的接入.比如你想要连接mysql数据库,只需要的配置文件里面加入mysq ...
- 优质分享 | Spring Boot 入门到放弃!!!
持续原创输出,点击上方蓝字关注我 目录 前言 视频目录 如何获取? 总结 前言 最近不知不觉写Spring Boot专栏已经写了九篇文章了,从最底层的项目搭建到源码解析以及高级整合的部分,作者一直在精 ...
- python实现单链表及链表常用功能
单链表及增删实现 单链表高级功能实现:反序,找中间结点,检测环等 参考: https://github.com/wangzheng0822/algo
- MySQL数据库之索引、事务、存储引擎详细讲解
一.索引 1.1 索引的概念 索引是一个排序的列表,存储着索引值和这个值所对应的物理地址 无须对整个表进行扫描,通过物理地址就可以找到所需数据 (数据库索引类似书中的目录,通过目录就可以快速査找所需信 ...