JWT鉴权

2023-05-22,

一、HTTP基本认证

Basic Authentication——当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码。

http auth的过程:

客户端发送http请求

服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header

如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。

如果没有,或者用户密码不对,则返回http code 401页面给客户端

标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header

一次典型的访问场景是:

浏览器发送http请求(没有Authorization header)

服务器端返回401页面

浏览器弹出认证对话框

用户输入帐号密码,并点确认

浏览器再次发出http请求(带着Authorization header)

服务器端认证通过,并返回页面

浏览器显示页面

项目举例

wordpress api 创建文章,返回401.

1、安装鉴权插件Application Passwords

admin登录——工具——上传插件(.zip)

用户——详情——Application Passwords——创建用户名(即该用户的名称)生成密码,记得保存下来。

2、xshell连接服务器

输入命令

echo -n "test001:123456" | base64

3、打开jmeter

Ctrl+0:线程组(作者)

Ctrl+1:HTTP请求(创建文章)

添加配置文件——HTTP Headers Manager

添加参数

Authorization:Basic空格Authorization

运行脚本,成功。

二、JWT鉴权

JWT是一种token based auth的标准。

JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。

头信息(Header)指定了该JWT使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'

HS256表明了使用HMAC-SHA256来生成签名。

消息体(payload)包含了JWT的意图,比如userId、roleId、expireTime等。

签名(Signature)是对前两部分的签名,防止数据篡改。签名首先需要指定1个秘钥(Secret),这个秘钥只有服务器才能知道,不能泄露给用户,然后使用Header里面指定的签名算法(默认是 HMAC SHA256),按照下面公式产生签名。

HMACSHA256(

base64UrlEncode(header) + "." +

base64UrlEncode(payload),

secret)

算出签名之后, Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

三、为什么要用JWT

随着技术的发展,分布式Web应用的普及,通过Session管理用户登录状态成本越来越高。因此慢慢发展为token的方式做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后,JWT的出现,检验方式更加简单便捷化,无需通过Redis缓存,而是直接根据Token取出用户的信息,以及对Token的可用性校验,单点登录更加便捷。

登录之后,Client保存Token信息,比如用Angular的LocalStorage来保存Token信息。之后每次请求业务接口,把Token信息放到Http请求的Head里面。

四、工作流程

-- 用户使用用户名和密码进行鉴权

服务端进行鉴权

服务端给客户端分配一个加密的token

客户端保存这个token,以后的每个请求,客户端都会发送这个token

服务端通过token判断是否是鉴权过的用户,并返回请求的响应数据

五、JWT的特点

简洁:可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快

自包含:payload中包含了所有用户所需要的信息,避免了多次查询数据库

JWT的应用场景

身份认证

安全要求的信息交换

JWT的结构

JWT包含了使用.分隔的三部分:

Header 头部:Base64Url(token类型+加密算法)

Payload 负载:Base64Url(用户信息)

Signature 签名:算法( base64UrlEncode(header) + "." + base64UrlEncode(payload), 密钥)

其结构看起来是这样的

xxxxx.yyyyy.zzzzz

签名用于验证消息的发送者以及消息是没有经过篡改的。如果黑客获取到了payload中的用户信息,并进行了篡改,那么经过Base64编码后也会发生变化,而签名是根据Header和Payload共同决定的,签名也会不一样,服务器就会判断出不一致。

下列的JWT展示了一个完整的JWT格式,它拼接了之前的Header, Payload以及秘钥签名:

JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

JWT 不加密的情况下,不能将秘密数据写入 JWT。

JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。

JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

六、如何使用JWT?

用户在客户端输入用户名和密码登录服务器;

服务器认证通过后,返回给用户一个JWT

客户端只需要本地保存该token(通常使用local storage,也可以使用cookie)即可。

当用户下次访问时,在Authorization头部使用Bearer模式添加JWT,格式Authorization: Bearer

服务端检查请求头Authorization中的JWT信息,如果合法,则允许用户的行为。

由于JWT是自包含的,因此减少了需要查询数据库的需要。

参考:

https://www.cnblogs.com/loveapple/p/10046835.html

https://blog.csdn.net/qq_26545305/article/details/88385470

JWT鉴权的相关教程结束。

《JWT鉴权.doc》

下载本文的Word格式文档,以方便收藏与打印。