双token刷新、续期,access_token和refresh_token实效如何设置

摘要:
access_令牌创建开始时间为2*access_用户中的“活动用户”在令牌有效时间内被视为活动用户。刷新对双令牌的访问_令牌和刷新_令牌首次使用帐户密码登录服务器时,将返回两个令牌:access_令牌和Refresh_令牌,持续时间不同。短访问_令牌到期后,发送具有长到期时间的刷新_令牌检索短期令牌。如果所有令牌都过期,您需要再次登录。refresh_令牌用于刷新access_令牌如果在有效期内,再次获得访问权_令牌,则上次获得的访问权_该令牌将无效。因此,在实际应用中,有必要存储令牌并定期调用访问。令牌接口会对其进行更新,以确保在任何时候进行的访问都是有效的。

原文链接:https://blog.csdn.net/a704397849/article/details/90216739

token认证,生成的token 过一段时间就会失效(不要故意把时间设的很长,这样不安全,token变得毫无意义!),用户需要重新登录获取token。用户经常使用客户端,使用过程中 由于token到期 客户端跳转到登录界面要求登录,这样体验极差!比如: token有效期2h,用户一直在使用客户端,使用过程中token到期跳转到登录页面邀请重新登录。第一次忍了,过了2个小时又要重新登录! 用户:MDZZ,再见。

为了解决上述 token过期了活跃用户需要在登录页面重新登录 问题,我们需要token刷新 。(注意:‘活跃’ 这个词).

在介绍双token刷新怎么实现之前,我们需要了解一个问题: 什么时候需要用户跳转登录页面重新登录?
token过期了就需要用户跳转登录页面重新登录? 显然不是的,如果是 不活跃用户 token过期了,确实需要跳转登录页面重新登录。 但是 活跃用户 ,就算token过期了,也不应该跳转登录页面。

细心的话,会发现我在上述过程中 强调了很多次 ‘活跃用户’ , 那么什么样的用户才算活跃用户?

‘活跃用户’

在 access_token创建开始时间点 到 2*access_token实效 的 时间内认为用户是活跃的。

下面是解释:

access_token有效期时长et
活跃用户时长at ,即用户在一次正常操作客户端后的at时间内都是活跃。 ( at >= et , 因为:用户access_token在有效期内我们认为用户是活跃 。)

为什么 at >=et ?

  • 假设 at =et

当用户登录后at = et 能满足: 用户access_token在有效期et内我们认为用户是活跃
当用户在登录后access_token结束前的某个点操作一次客户端后, at = et 还是能满足: 用户access_token在有效期et内我们认为用户是活跃 。
如下图

双token刷新、续期,access_token和refresh_token实效如何设置第1张

  • 假设at > et

当用户登录后at > et 能满足: 用户access_token在有效期et内我们认为用户是活跃
当用户在登录后access_token结束前的某个点操作一次客户端后, at > et 还是能满足: 用户access_token在有效期et内我们认为用户是活跃。
如下图:

双token刷新、续期,access_token和refresh_token实效如何设置第2张

  • 假设at < et

当用户登录后at < et 不能满足: 用户access_token在有效期et内我们认为用户是活跃 。所以不成立
如下图:

双token刷新、续期,access_token和refresh_token实效如何设置第3张 

由上3个假设 at=et成立,at>et成立,at<et不成立,得知 at>=et
总结:
若access_token有效期时长et ,活跃用户时长at ,那么有 at >=et ,且用户每次正常操作客户端后用户活跃时间应刷新(即用户一次正常操作客户端后的at时间内都是活跃的), 所以可以认为 [access_token创建开始时间点 ,2*access_token有效时长 ] 时间内用户是活跃的

声明: 本篇文章所指的 活跃用户 参照的是token有效期,不要和读者自己项目中活跃用户的定义 强行作比较。
操作一次客户端是指有请求服务器的操作。


双token的刷新 access_token和refresh_token

第一次用账号密码登录服务器会返回两个 token : access_token 和 refresh_token,时效长短不一样。短的access_token 时效过了之后,发送时效长的 refresh_token 重新获取一个短时效token,如果都过期,就需要重新登录了。

refresh_token 就是用来刷新access_token 。活跃用户的 access_token 过期了,用refresh_token 获取 新的access_token 。

access_token 和 refresh_token 的有效时间如何设置
为了保证能够刷新活跃用户的access_token , refresh_token 的有效时间 不能小于 用户活跃时间点
假设 access_token 有效时间是 et ,那么用户在 [ access_token 起始时间点 ,2*et ] 时间内用户是活跃的 ,由此可知 refresh_token 的有效时间 >= 2 * access_token 的有效时间

一般,refresh_token 的有效时间 > 2 * access_token 的有效时间
比如,access_token 实效7天,那么 refresh_token 实效可以给15天,也可以给30天
当然,access_token和refresh_token 的时长具体多少,需要根据环境决定,如涉及到金钱的 银行客户端,12306客户端等 token时长都很短,而普通app客户端的token可以是几天甚至上月.

刷新refresh_token
每次 刷新access_token 时判断 refresh_token 是否快过期 [ refresh_token 剩余有效时间 <= 2*access_token实效],如果是,那就连refresh_token 也刷新。
如果希望降低 刷新refresh_token 频率,可以将 refresh_token 实效提高

access_token数值选择

access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口获取access_token。在理想情况下,每天只需要获取12次,即每2小时获取一次。如果在有效期内,再次获取access_token,那么上一次获取的access_token将失效。

如果每次发送客服消息、获取用户信息、群发消息之前都要先调用获取access_token接口得到接口访问凭证,这显然是不合理的,一方面会更耗时(多了一次接口调用操作),另一方面access_token的调用也存在限制。

因此,在实际应用中,需要将获取到的access_token存储起来,然后定期调用access_token接口更新它,以保证随时取出的access_token都是有效的。

对于access_token的存储,可以考虑存储在文件、数据库或内存中。具体采用哪种存储方式,需要根据项目实际情况而定。如果只有一台服务器,直接将access_token存储在内存中是最简便有效的方式。

免责声明:文章转载自《双token刷新、续期,access_token和refresh_token实效如何设置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何快速熟悉新项目的代码?Gitlab--安装及汉化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[C++] OOP

Access Control And Inheritance Protected Member Like private, protected members are unaccessible to users of the class Like public, protected members are accessible to members and...

go redis锁

redis经常用作分布式锁,这里记录一个简单的锁代码如下: package main import ( "crypto/rand" "encoding/base64" "fmt" "github.com/go-redis/redis" "io" "sync" "time" ) func main(...

【原创】Capture CIS利用Access数据库建立封装库说明

1、在服务器端建立新空间,方便封装库以及数据库的归档存放    服务器路径:\192.168.1.234ShareSTG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib存放Allegro封装,Schematic_Lib存放Capture封装,STG_Datebase存放数据库文件。   2、构建Access数据库 1)打开A...

ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

一、前言 1、本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2、本教程环境信息 软件/环境 说明 操作系统 Windows 10 SDK 2.1.401 ASP.NET Core 2.1.3 MySQL 8.0.x IDE Visual Studio C...

iOS网络请求安全认证(JWT,RSA)

在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光。当然,你可能会采用加密算法来加密数据,但是这仍然不够。 在移动端和服务器的通信过程中,有两种认证方式:token和session。 Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求...

ranger kafka

Authorizing Kafka access over non-authenticated channel via Ranger This section answers some questions one is likely to encounter when trying to authorize access to Kafka over non...