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 ...
随机推荐
- CentOS7 【linux系统】配置 JDK 教程
1. 下载 [linux版本] JDK 1.8 的包. 2. 导入linux系统里面. 如何导入,下载一个winSCP 软件 破解安装,然后再linux 系统里面 查询IP,连接即可. 在linux解 ...
- 实验一 C运行环境与最简单的程序设计
实验一: #include<stdio.h> int main() { int a1,a2; int sum; a1 =123; a2 = 456; sum = a1+ ...
- 【漏洞复现】MSF添加ms17-010的exp脚本及攻击复现
原文地址:https://bbs.ichunqiu.com/thread-23115-1-1.html 本来今晚在准备复现最近的CVE-2017-11882,由于本人是小白一枚,不知道这么添加msf的 ...
- 「DevOps 转型与实践」沙龙回顾第一讲
9 月 19 日,CODING 和中国 DevOps 社区联合举办的深圳第九届 Meetup 在腾讯大厦 2 楼多功能圆满结束.本次沙龙以 「DevOps 转型与实践」 为主题,4 位来自互联网.金融 ...
- 微服务通信之feign集成负载均衡
前言 书接上文,feign接口是如何注册到容器想必已然清楚,现在我们着重关心一个问题,feign调用服务的时候是如何抉择的?上一篇主要是从读源码的角度入手,后续将会逐步从软件构架方面进行剖析. 一.R ...
- 踩坑 Pycharm 2020.1.1 安装/ JetBrains破解/ anacode配置
引言 网上的办法试了很多,通常不能解决问题,还会引发一些负效应,选取了一个试了两天终于成功的方案记录一下备用. Pycharm安装 https://www.jetbrains.com/pycharm/ ...
- Dotnet Core使用特定的SDK&Runtime版本
Dotnet Core的SDK版本总在升级,怎么使用一个特定的版本呢? 假期过完了,心情还在.今天写个短的. 一.前言 写这个是因为昨天刷微软官方文档,发现global.json在 SDK 3.0 ...
- 多测师讲解rf _基本使用002_高级讲师肖sir
在你安装好RF-ride之后,桌面就会生成一个RIDE图标.双击启动,界面如下:
- pyquery 匹配NavigableString
pyquery 匹配NavigableString不像xpath那样精确找打匹配对象,只需匹配包含NavigableString的根节点
- Go 安装配置golint
原文链接:http://zhoubotong.site/post/3.html一. Golint介绍 Golint 是一个源码检测工具用于检测代码规范 Golint 不同于gofmt, Gofmt用于 ...