zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Jmeter接口测试-JWT鉴权

测试接口 JMeter JWT 鉴权
2023-09-11 14:19:05 时间

登录及jwt(json+web+token)鉴权

Web的登录鉴权方式(cookie base):
HTTP的特性:短连接、是无状态的、每次发送的请求都是新的,服务器无法知道每次请求是哪个用户发送的?那么如何才能知道每次发送的请求是哪个用户发送的呢?     --- 通过session实现

(客户端)
client(web) ------------>server
                                    (服务端)

网站调用登录接口传入username、password 到达服务器端此时服务器会鉴权,鉴权通过此时服务器会产生一个session,此时这个session是有一个sessionid的,然后服务器将这个session加密后通过set-cookie的方式发送给客户端(从cookie里面发送,一串类似指纹的token)客户端把token解出来以后可以知道在服务端对应的sessionid是哪一个,之后每一次发送的请求都会带上cookie,cookie里面的信息是token,服务器看到token以后会把token和session进行关联起来。这样服务器就可以知道那个用户登录了,用户是谁。登录态是在cookie中,清掉cookie需要重新登录。cookie是存在哪里呢?--浏览器中

App的登录鉴权方式(token base):

(客户端)
client(app) ------------>server
                                  (服务端)

通过服务器发送一个数据:本地存文件-类似cookie方式
服务器端会实现一套cookie过期机制,这个方法并不简单。那么有没有什么更简单的办法呢?


一个请求(包含username/password)发送给服务器,服务器会鉴权,这时候没有session这时候通过username/password知道哪个用户登录,然后将用户信息加密(加密成一个token-类似字符串)然后把token发送给客户端-客户端把token保存起来,之后每一次发送服务端的请求都带上token,服务器端收到token以后可以通过token反解出来这个用户是谁?及过期时间,比如token是否在过期时间之内,如果已经超过过期时间就实效了,在发送一个新的token给我。

这种方式的优势和劣势:
在服务器端没有开任何的session,没有什么空间开销,撑得用户数会多一些。但是解token会占用cpu,消耗时间。

思考一个问题:http请求通过什么方式把token发到服务器?
一般把token放到header中发送到服务器 。在访问需要鉴权的接口时,我们将token放到http请求的header中,如果该token是有效的,那么接口正常返回,否则接口返回401错误。

实   现

POST /login username/password这个接口提供了登录功能。

如果username和password组合是正确的,该接口将返回如下的信息

  • id: 登录用户的id
  • username: 登录用户的用户名
  • token: 用户登录的凭证,登录之后,所有的后续请求都必须包含该token。
{
  "id":2,
  "username":"admin",
  "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWQiOjIsImlhdCI6MTQ3MzQ5Nzc1MCwiZXhwIjoxNTU5ODk3NzUwfQ.CkxZAESKLNVu8FOOkxqdbpBukl2FFteAvPWOQulXPgc"
}

 1.我们将注册的API接口停掉,避免每次都注册。因为我们要验证的是登录接口。我们现在取一个注册已经好的用户名和密码登录系统user_251,user251,如下图所示:

2.运行结果后,查看结果树查看我们发送的请求是否发送成功,返回token是否成功。

如上图所示,我们登录接口发送的请求成功,并且返回了一个token这个token是加密过得。那么我们接下来如何获取这个token的值呢呢?当热,我们可以通过变量的方式获取token的值,具体请看下面的操作。

3.我们在登录请求右键---添加--后置处理器--选择json extractor 方式来获取token的值

4.在json extractor中需要进行如下设置,我们在variablenames中设置一个变量名,方便后面引用这个变量名,然后获取token的值$.token代表的是从根下面取第一个token值,找不到就报错:NOT FOUND

我们设置的变量名token,获取这个token变量的目的是方便在后面使用,很重要哦!所以,先暂时介绍到这里。我们继续聊正题!

5.设置完成后,我们需要做登陆后的断言,没有断言的接口测试是不严谨的。这里我们使用jmeter提供给我们的“响应断言”,因为这种的方式比较简单,好理解,也能解决实际问题。如图所示,我们添加一个响应断言:

6.响应断言里面参数设置如下图所示:

7.验证断言是否成功,我们再次运行登陆接口请求API。