本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/111313034
之前分享过 session-cookie 的认证,这次来分享下 我遇到的Token认证。
这是我写的 接口测试的category ,有兴趣 可以看看;
个人博客:https://blog.csdn.net/zyooooxie
JSON Web Token
最近测试某个需求,这个系统鉴权用到了JWT+Session;这儿来说下 JWT。
说下认证流程:
- 客户端使用 用户名和密码 发送post请求;
- 服务端收到请求,去验证用户名与密码。验证成功后,服务端使用私钥 创建一个jwt,再把这个jwt发送给客户端;
- 客户端收到 这个jwt后,把它存储起来,放在 Cookie 里。后续 客户端每次向服务端请求资源的时候 带着这个jwt;
- 服务端收到请求,然后去验证 这个jwt的合法性;如果验证成功,就向客户端返回请求的数据 ,如果不成功 返回401错误码,鉴权失败。
实战
1. requests.session()
gl_login_url = 'zyooooxie/api/user/login/'
gl_project_url = 'zyooooxie/api/project/'
def session_login_project():
print('发起 登录请求')
s = requests.session()
res = s.post(url=gl_login_url, data={'username': 'zyooooxie', 'password': 'csdn'})
print('看下 响应头:')
print(res.headers)
print(res.headers['Set-Cookie'])
print('看下 请求头:')
req = res.request
print(req.headers)
print('发起 第二个请求')
res_0 = s.get(url=gl_project_url)
print('第二个请求,响应头:')
print(res_0.headers)
req_0 = res_0.request
print('第二个请求,请求头:')
print(req_0.headers)
2. get()参数cookies 传 RequestsCookieJar()
使用 第一步 方法执行后的 jwt和SESSION值
def cookie_project():
jar = RequestsCookieJar()
jar.set('jwt', 'zyooooxie')
jar.set('LANDSAT:SESSION:', 'zyooooxie')
res_1 = requests.get(url=gl_project_url, cookies=jar)
print('单独 请求,响应头:')
print(res_1.headers)
req_1 = res_1.request
print('单独 请求,请求头:')
print(req_1.headers)
3. 正则提取 登录接口的jwt和SESSION值, get()参数cookies 传 RequestsCookieJar()
def cookie_login_project():
res = requests.post(url=gl_login_url, data={'username': 'zyooooxie', 'password': 'csdn'})
print('第一次 登录请求,响应头:')
print(res.headers)
sc = res.headers['Set-Cookie']
print(sc, type(sc))
jwt_re = r'jwt=(\w.+?);'
jwt_str = re.search(jwt_re, sc).group(1)
session_re = r'LANDSAT:SESSION:=(\w.+?);'
session_str = re.search(session_re, sc).group(1)
req = res.request
print('第一次 登录请求,请求头', req.headers)
jar = RequestsCookieJar()
jar.set('jwt', jwt_str)
jar.set('LANDSAT:SESSION:', session_str)
res_2 = requests.get(url=gl_project_url, cookies=jar)
print('请求,响应头:')
print(res_2.headers)
req_2 = res_2.request
print('请求,请求头:')
print(req_2.headers)
这一次,打印的:
4. dict_from_cookiejar处理 响应的cookies,拿到登录接口的jwt和SESSION值, get()参数cookies 传 RequestsCookieJar()
def dict_cookie_login_project():
res = requests.post(url=gl_login_url, data={'username': 'zyooooxie', 'password': 'csdn'})
print('第1次 登录请求,响应头:')
res_cookie = res.cookies
print(res_cookie)
cookie_dict = dict_from_cookiejar(res_cookie)
print(cookie_dict)
# # 下面2种 都可以
# jar = RequestsCookieJar()
# jar.set('jwt', cookie_dict['jwt'])
# jar.set('LANDSAT:SESSION:', cookie_dict['LANDSAT:SESSION:'])
# res_3 = requests.get(url=gl_project_url, cookies=jar)
res_3 = requests.get(url=gl_project_url, cookies=cookie_dict)
print('第2次 请求,响应头:')
print(res_3.headers)
req_3 = res_3.request
print('第2次 请求,请求头:')
print(req_3.headers)
JWT解码后 PAYLOAD出现秘密数据
JWT 不加密的情况下,不能将秘密数据写入 JWT;
但我还真碰上了;
某手机App的Token
先说下流程:
- App端发起登录请求,发送加密的用户名和密码到服务器;
- 服务器验证用户名和密码,如果成功,生成一份Token【会有一个有效期】,存储到服务器中,同时将此Token返回给App端;
- App端将此Token保存到本地,以后App请求时,凡是需要验证的地方都要带上该Token,然后服务器端验证Token和有效期,成功返回所需要的结果,失败返回错误信息,重新登录。
拿我之前公司的App来分享下:
翻找出来 以前的代码 :
我现在公司 测过 某App,走得是 比较传统的 cookie + session, 我把这部分 加到 session-cookie 的认证
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie