使用Simple JWT提供认证服务(详细介绍access_token和refresh_token的使用)

基本概念

JSON Web Token(JWT)

JSON Web Token(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC 7519)。

  • 它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。
  • JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。

Simple JWT

Simple JWT为Django REST框架提供了一个JSON Web Token身份验证后端

主要用途

  • 提供身份鉴别认证
  • 标识用户登陆状态

Cookie、Session、Token的区别

Cookie

一开始HTTP是无状态的,用户访问完Web网站浏览完就无任何连接
随着用户需求的提升和技术的发展,用户希望以交互的形式进行网站访问,例如发表评论,记录生活,便出现Cookie的技术。

  • Cookie是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。

以购物为例子
用户添加商品到购物车时,浏览器像服务器发送请求,服务器会查找到此商品到id并存储在Cooike中返回。浏览器将接收到的Cooike存储在本地,当下一次访问时会继续携带Cooike请求服务器。

但是随着购物车商品越来越多,请求的Cookie越来越多,请求压力也越大。同时我们会发现Cookie存放的信息本身就是服务器提供的,服务器本身有,我们为什么还要多才发送相同的数据?

Session

为了解决Cookie带来的问题,便出现出现了存储在服务器的Session

  1. 用户每次登陆,Session为其分配一个唯一的 sessionId,我们可以查到使用这个 sessionId的用户。而sessionId我们通过cookie返回给用户。
  2. 当后续再添加商品时我们通过携带的 sessionId的便可以知道是哪一个用户需要的商品

但是随着用户的增多,一台服务器不能满足我们的日常所需,我们会新增服务器,但是此时出现的问题是Session存储在哪个服务器,不能很好的支持分布式

Token

Token不存储在服务器端,所以无需考虑多台服务器Token的同步问题。
用户信息存储在Token中,我们每次只需要携带Token请求服务端我们就可以知道是哪个用户。
但是Token有效期不是永久的,当过期之后用户便无法通过认证,我们需要获取新的Token

Token在有效期内我们可以认为用户是登陆状态,当Token失效后我们就需要用户重新登录

Token续签

延长Token过期时间有两种方案

  1. access_token
  2. refresh_token

首次登陆
在这里插入图片描述
后续登陆
在这里插入图片描述
当 access_token 过期时,需要通过 refresh_token 来刷新,拿到新的 access_token 和 refresh_token

我们已经有了access_token便可以通过认证,为什么还需要refresh_token 呢?

我们只有输入账号密码通过验证之后才可以拿到access_token,access_token失效我们还需要再次输入账号密码重新登陆
但是有了refresh_token,我们就可以直接识别用户,无需再次输入账号密码便可以获取access_token

实际业务中,假设我们设置的access_token为1天,用户1天内无需输入密码,如果用户只使用1次后续很长一段时间不在使用,我们把这个用户标识为非活跃用户,后续某天再次使用系统需要重新登陆密码。如果用户在access_token有效的1天内每个一段时间访问,我们标识为活跃用户,当第二天token失效重新登陆密码会影响用户体验,此时我们如果使用refresh_token自动刷新用户就无需输入账号密码。

access_token 和 refresh_token的时效就需要设置不一致,当短的access_token 时效过了之后,发送时效长的 refresh_token 重新获取一个短时效access_token。
如果都过期,就需要重新登录了。

总结
活跃用户token失效不能让其跳转登陆界面
非活跃用户token失效需要跳转登陆界面

access_token 和 refresh_token时效设置

为了保证能够刷新活跃用户的access_token , refresh_token 的有效时间不能小于用户活跃时间点
一般,refresh_token 的有效时间 > 2 * access_token 的有效时间

比如,access_token 实效7天,那么 refresh_token 实效可以给15天,也可以给30天

我们每次请求需要携带access_token,但是我们不能每次请求前通过接口获取access_token,我们可以将首次获取的access_token存储,定期通过refresh_token刷新。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT_REFRESH_TOKEN_EXPIRES 是一个用于设置 JWT 刷新令牌过期时间的变量,它通常与 JWT_ACCESS_TOKEN_EXPIRES 一起使用。下面是一个使用 Flask-JWT-Extended 扩展的例子: ```python from flask import Flask from flask_jwt_extended import JWTManager, create_access_token, create_refresh_token, jwt_required, jwt_refresh_token_required, get_jwt_identity, get_raw_jwt app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置 JWT 密钥 app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600 # 设置访问令牌过期时间为 1 小时 app.config['JWT_REFRESH_TOKEN_EXPIRES'] = 604800 # 设置刷新令牌过期时间为 1 周 jwt = JWTManager(app) # 用户登录,生成访问令牌和刷新令牌 @app.route('/login', methods=['POST']) def login(): username = request.json.get('username', None) password = request.json.get('password', None) if username != 'admin' or password != 'admin': return jsonify({'msg': 'Invalid username or password'}), 401 access_token = create_access_token(identity=username) refresh_token = create_refresh_token(identity=username) return jsonify({'access_token': access_token, 'refresh_token': refresh_token}), 200 # 使用访问令牌访问受保护的资源 @app.route('/protected', methods=['GET']) @jwt_required def protected(): current_user = get_jwt_identity() return jsonify({'msg': f'Hello, {current_user}!'}), 200 # 使用刷新令牌刷新访问令牌 @app.route('/refresh', methods=['POST']) @jwt_refresh_token_required def refresh(): current_user = get_jwt_identity() access_token = create_access_token(identity=current_user) return jsonify({'access_token': access_token}), 200 if __name__ == '__main__': app.run() ``` 在上面的例子中,我们设置了 JWT_REFRESH_TOKEN_EXPIRES 为 1 周,表示刷新令牌在 1 周后过期。当用户登录成功后,我们生成了一个访问令牌和一个刷新令牌,并将它们返回给客户端。当客户端使用访问令牌访问受保护的资源时,我们使用 @jwt_required 装饰器来保护该路由,只有在客户端提供有效的访问令牌时才能访问。当客户端的访问令牌过期时,客户端可以使用刷新令牌来获取新的访问令牌,我们使用 @jwt_refresh_token_required 装饰器来保护刷新令牌路由,只有在客户端提供有效的刷新令牌时才能刷新访问令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值