jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?

什么是JSON Web Token

官网介绍:

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSAECDSA的公用/专用密钥对对JWT进行签名

尽管可以对JWT进行加密以在各方之间提供保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。

emmmm.......balabala一堆文字,那么我们来简单总结下:

JWT是一个JSON信息传输的开放标准,它可以使用密钥对信息进行数字签名,以确保信息是可验证和可信任的。

JWT的结构是什么?

JWT由三部分构成:header(头部)、payload(载荷)和signature(签名)。 以紧凑的形式由这三部分组成,由“.“分隔。

因此,JWT通常如下所示。

xxxxx.yyyyy.zzzzz

让我们把这串奇奇怪怪的东西分解开来:

header

header通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA等等。

例如:

{  "alg": "HS256", "typ": "JWT" }

显而易见,这货是一个json数据,然后这货会被Base64编码形成JWT的第一部分,也就是xxxxx.yyyyy.zzzzz中的xxxxxx

Payload

这货是JWT的第二部分,叫载荷(负载),内容也是一个json对象,它是存放有效信息的地方,它可以存放JWT提供的现成字段 :

  • iss: 该JWT的签发者。
  • sub: 该JWT所面向的用户。
  • aud: 接收该JWT的一方。
  • exp(expires): 什么时候过期,这里是一个Unix时间戳。
  • iat(issued at): 在什么时候签发的。

举个例子:

{  "iss": "www.baidu.com",  "sub": "you",  "aud": "me",  "name": "456",  "admin": true,  "iat": 1584091337,  "exp": 1784091337,}

这货同样会被Base64编码,然后形成JWT的第二部分,也就是xxxxx.yyyyy.zzzzz中的yyyyyy

Signature

这是JWT的第三部分,叫做签名,此部分用于防止JWT内容被篡改。将上面的两个编码后的字符串都用英文句号.连接在一起(头部在前),就形成了

xxxxxx.yyyyyy

然后再使用header中声明签名算法进行签名。 如果要使用HMAC SHA256算法,则将通过以下方式创建签名:

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

当然,在加密的时候,我们还需要提供一个密钥(secret),我们可以自己随意指定。这样就形成了JWT的第三部分,也就是xxxxx.yyyyy.zzzzz中的zzzzzz

最后,我们把这三个部分拼在一起,就形成了一个完整的JWT。

下面展示了一个完整的JWT,它先对header和payload进行编码,最后用一个密钥形成了签名。

16735a706575b012a556d576e7d7a15c.png

如果我们想试验一下的话,可以在JWT的官网进行debugger。贴一下官网: https://jwt.io/

665b0b72925ec898c791bfeea9218c9f.png

JSON Web Token认证流程

3d65f5e3e9c5b61d6dc8dfeae152c0f5.png

什么时候应该使用JSON Web Token?

以下是JSON Web Token 有用的一些情况:

  • 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
  • 信息交换:JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。

那么,有人就会说了,道理我都懂,我应该怎样去实现呢?莫慌。。

cb1d46ecea7cb5f3734e0ea95a849ebc.png

如何实现?

接下来我会用python实现JWT,不想拉仇恨,但是,python大法好啊。。。。

在前后端分离的项目中,我们需要与前端约定一种身份认证机制。当用户登录的时候,后端会生成token,然后返回给前端,前端需要将token拿到并按照一定规则放到header中,在下一次请求的时候一并发送给后端,后端进行token身份校验。

这里我们约定前端请求后端服务时需要添加头信息Authorization ,内容为token。

我用的是fastapi web框架,搭建项目非常快。

from datetime import timedelta, datetimeimport jwtfrom fastapi import FastAPI, HTTPException, Dependsfrom starlette.status import HTTP_401_UNAUTHORIZEDfrom starlette.requests import Requestapp = FastAPI()SECRET_KEY = "sdifhgsiasfjaofhslio" # JWY签名所使用的密钥,是私密的,只在服务端保存ALGORITHM = "HS256" # 加密算法,我这里使用的是HS256@app.get("/")async def root():    return {"message": "Hello World"}@app.post("/create_token")def create_token(username,password):    if username == "123" and password == "123":        access_token_expires = timedelta(minutes=60)        expire = datetime.utcnow() + access_token_expires        payload = {                    "sub": username,                    "exp": expire                     }        # 生成Token,返回给前端        access_token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)        return {"access_token": access_token, "token_type": "bearer"}    else:        raise HTTPException(            status_code=HTTP_401_UNAUTHORIZED,            detail="username or password are not true",            headers={"WWW-Authenticate": "Bearer"}        )def authorized_user(token):    try:        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])        username: str = payload.get("sub")        print(username)        if username == "123":            return username    except jwt.PyJWTError:        raise HTTPException(        status_code=HTTP_401_UNAUTHORIZED,        detail="认证失败,无权查看",        headers={"WWW-Authenticate": "Bearer"},)@app.get("/app")def create_token(request: Request):    print(request.headers.get("host"), request.headers.get("Authorization"))    user = authorized_user(request.headers.get("Authorization")) # 验证Token    if user:        return {"username": user,"detail": "JWT通过,查询成功"}

这里,由于现有的JWT库已经帮我们封装好了,我们可以使用JWT直接生成 token,不用手动base64加密和拼接。

测试一下:

启动项目之后,我们打开http://127.0.0.1:8000/docs# ,就会看到以下我们编写好的api:

82cc2c06c2ab06daeb32bc04add89ddb.png

首先,我们先验证一下create_token接口

8c966d44fee14f45917167915f4e8096

当我们输入用户名,密码后,后端进行验证,验证成功后会返回给前端一个token,也就是JWT。当前端拿到这个token之后,下次在请求的时候就必须要带上这个token了,因为前后端已经约定好了。接下来我们试一下:

aea2b317b0e797bc3ebba85cb121429e.png

认证失败???

2f9f2718acbb0e6566259af6da9b2d5b.png

什么原因导致的呢??让我们点开检查抓一下包看看:

c25db354fe1c5058c812b574f658003f.png

恍然大悟,刚才我们说过,前后端事先约定好的,请求的header中一定要带上token,在Authorization ,内容token。我们现在这个请求的header中并没有带上token,那这种debug模式下又是改不了请求header信息的,我们可以使用接口测试工具进行测试,我主推Postman!!!,让我们来试一下:

2da5613c5ce8da6bfa6225c425706591.png

至此,JWT介绍以及使用梳理完毕。

最后,感谢女朋友在生活中,工作上的包容、理解与支持 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8月日更,我的困难与感悟

8月份参加了掘金的日更活动,坚持每天写技术文章进行分享,现在活动结束了,来复盘下这一个月来我的困难与感悟。8月日更其实刚开始我是不想参加这个活动的,最近确实比较忙,不管是工作还是自己的私事,都不允许…

那些神一样的学习技巧,专治各种不服!

▲ 点击查看著名的俄国生理学家曾反复对自己的学生提过这个要求:“应当先学会观察,观察。不学会观察,你就永远当不了科学家。”鲁迅也曾这样教导:“如果要创作,第一要观察。”在《神探夏洛克》中,有这么一段…

kafka 怎么样连接图形化界面_图形化编程有多简单,点亮LED不到一分钟

Arduino编程在所有单片机当中应该说是最简单的了,但是还可以更加简单。比如说图形化编程,图形化编程真正让Arduino大众化了,因为谁都可以通过图形化编程方式来制作自己需要的小玩意。啃萝卜关于图形化编程软件有很多,我独宠啃萝卜…

linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

linux设备驱动归纳总结(一):内核的相关基础概念1. 内核与 linux 设备驱动的作用与关系内核:用于管理软硬件资源,并提供运行环境。如分配 4G 虚拟空间等。linux 设备驱动:是连接硬件和内核之间的桥梁。linux 系统按个人理解可按下划…

怪不得超市不让带宠物...

1 难怪超市不让带狗啊▼2 医学生的聊天记录过于硬核▼3 你身边的外卖小哥头盔上都顶着什么呢?▼4 表妹非要把猫脸P到蜜蜂身上▼5 其实主要还是看脸脸到位了,祖安小公举问题都不大▼6 就你们这个送别方式我觉得他是回不来了......▼7 妹妹沦为工具…

自定义控件复选框和单选框的实现

我们先实现单个按钮,为了复用,不管单选还是复选按钮都是使用同一个类来实现,为了区别单选还是复选,我们用一个自定义枚举类型CheckButtonStyle属性style来区别,当其值设置为CheckButtonStyleDefault或CheckButtonStyle…

单文件组件的组件传值_移动端组件化架构(下)

我的组件化方案对于项目架构来说,一定要建立于业务之上来设计架构。不同的项目业务不同,组件化方案的设计也会不同,应该设计最适合公司业务的架构。架构设计以我之前公司项目为例,项目是一个地图导航应用,业务层之下的…

为什么圆是360度?超颠覆的解释

圆为什么有360度?为什么不是300度呢?古文明时期人类把很多不能解释的自然现象归结为“天意”真的有天意吗?我们把圆分成等份,奇迹出现了.....依次等分下去,结果一样...任何被分成等分的角度的所有数字之和为9现在我们来…

我获得“微软MVP”奖项,后续将会贡献更多技术内容

昨天晚上,我收到了微软总部发来的“恭喜获得MVP”的邮件。请点击【阅读原文】查看我的MVP Profile页面。有的朋友说“一直以为你早就是MVP了”。其实这么多年我做的技术贡献主要是录编程视频教程,而这些视频教程都是通过BT下载等方式传播,没有…

[Spring MVC] - InitBinder验证

Spring MVC使用InitBinder验证: 使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用。大部份简单的表单验证,使用annotation验证即可以解决。 Annotation验证使用方法可参…

linux6.5进入救援模式,rhel6.5救援模式修复系统

如果系统中很多重要的部分被删除了例如/boot下的所有东西,则可以通过救援模式[rootdazzle1 桌面]# mkdir /backup[rootdazzle1 桌面]# cp /etc/fstab /backup/fstab  //先备份以下fstab文件,也可以不备份自己写[rootdazzle1 桌面]# rm -rf /boot/*  …

一名毕业生的自述:我知道我必须写论文,但没聪明到可以写出来......

全世界只有3.14 % 的人关注了爆炸吧知识2020年转眼就到了4月。在即将毕业的学子之间,每天的狂野问候语是这样的:“你论文改完了吗?”“你论文查重率是多少?”“你什么时候答辩?”在微博上实时搜索“翟天临”三个字&…

不是架构的架构之四:业务层的实现与自动代理

我们在开篇中提到,希望能有一种办法,能自动适应系统的环境配置,在局域网小型应用中将直接访问数据库以获得最高的性能,在分布式环境中自动使用WCF来获得较好的安全性和连通性。 但是,我们不希望这样的特性使我们的开发…

python程序设计实践教程陈东_Python

“我们正步入一个数据或许比软件更重要的新时代。——Tim OReilly” 运用数据是精准刻画事物、呈现发展规律的主要手段,分析数据展示规律,把思想变得更精细! 本课程面向各类编程学习者,讲解利用Python语言表达N维数据并结合数据特…

Silverlight中开发和设计人员的合作文档信息

-----------------------------------------------------------------------------------> copyright:http://www.docin.com/p-34191215.html转载于:https://www.cnblogs.com/molin/archive/2009/12/08/silverlight_manager.html

和男朋友一块儿吃VS单独一人在家吃饭

1 和男朋友一块儿吃VS单独一人在家吃饭2 忍不住要为这位跳高选手鼓掌了3 我们家的蔬菜就没有这种觉悟4 这螳螂拳算是练到家了5 现实中的你胖的一批 6 这套户型咋样?7 你能看出几个字你点的每个赞,我都认真当成了喜欢

指针04 - 零基础入门学习C语言44

第八章:指针04 让编程改变世界 Change the world by program 小结 归纳起来, 如果有一个实参数组, 想在函数中改变此数组中的元素的值, 实参与形参的对应关系有以下4种情况: (1) 形参和实参都用数组名, 如: [codesyntax lang&…

填坑 | .NET 5在Docker中访问MSSQL报错

【.NET Core】| 作者 / Edison Zhou不知道你有没有在.NET Core/.NET 5的Docker访问MS SQL Server数据库,如果有,那么很有可能会遇到这个错误。1SSL版本错误最近在公司用.NET 5重构部分业务服务,由于之前老系统使用了MS SQL Server数据库&…

六个机械原理,动图形象直观、解读通俗易懂

全世界只有3.14 % 的人关注了爆炸吧知识01间歇运动机构▼间歇运动机构能够将原动件的连续转动转变为从动件周期性运动和停歇的机构,称为间歇运动机构。例如牛头刨床工作台的横向进给运动,电影放映机的送片运动等都用有间歇运动机构。常见的间歇运动机构有…

linux读写usb host,LINUX下USB1.1设备学习小记(3)_host与device

各位还记得”任何传输都是由host发起的”这句话么~在usb设备插入pc中到拔出usb设备,都是由host进行询问的一个usb鼠标的工作流程可以表达如下:usb鼠标插入pc中:主机询问设备:给我你的设备信息(控制传输)主机根据usb鼠标的设备信息进行驱动配置,配置结束后主机询问设备:给我你的…