Access/Refresh Token的获取与更改

Token标识概念引入

由于使用Http/Https协议访问网页、是无状态的会话、

为了辨别访问的用户身份、故有了Session和Cookie。


session

在服务器端记录、允许通过将对象存储在Web服务器的内存中、在整个用户对话过程中保持任何对象。

随着越来越多用户登录,Session所需要的服务器内存量也会不断增加。因此Cookie为此而生——

储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。通俗来讲就是指缓存数据,包括用户名、密码、手机号等。

随科技进步、使得前端和后端的概念解耦, 移动应用和网页应用可以使用相同的后端、为了应对非WEB的环境, Oauth2.0 引入了Token。

token

由服务端生成,存放在客户端(浏览器客户端就放在Cookie中,移动端:存在移动端中)


Access/Refresh Token是什么

Token作为用户获取受保护资源的凭证,必须设置一个过期时间,否则一次登录便可永久使用,认证功能就失去了意义。

但是矛盾在于:过期时间设置得太长,用户数据的安全性将大打折扣;过期时间设置得太短,用户就必须每隔一段时间重新登录,以获取新的凭证,这会极大挫伤用户的积极性。针对这一问题,我们可以利用Access / Refresh Token这一概念来平衡Token安全性和用户体验。

Access Token即“访问令牌”,是客户端向资源服务器换取资源的凭证;

Refresh Token即“刷新令牌”,是客户端向认证服务器换取Access Token的凭证。

颁发20分钟有效期的 Access token 和6个月有效期的 Refresh token, 当 Access token 过期后(或者快要过期的时候), 使用 Refresh token 获取一个新的 Access token , 直到 Refresh token 过期, 用户重新登录, 这样整个过程中,用户只需要登录一次, 用户体验好。


• Access token 泄露了怎么办?  

    ——没关系, 它很快就会过期。

• Refresh token泄露了怎么办?  

    ——没关系, 使用 Refresh token 是需要客户端秘钥 Client secret 的。

Access/Refresh Token 是如何配合使用的

1. 用户提供身份信息(一般是用户名密码),利用客户端向认证服务器换取 Refresh Token和Access Token;

2. 客户端携带Access Token访问资源服务器,资源服务器识别Access Token并返回资源;

3. 当Access Token过期或失效,客户端再一次访问资源服务器,资源服务器返回“无效token”报错;

4. 客户端通过Refresh Token向认证服务器换取Access Token,认证服务器返回新的Access Token。

図1.png


Token的书写组成

  ——为三段式:

第一段:Header  :公司信息,加密方式等

第二段:Payload:真正的加密数据、存放用户的信息

第三段:Signature:签名,通过第一段和第二段,通过加密方式加密得到的

通过JWT(Json web token)认证、是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准

図2.jpg


如何取得Access/Refresh Token

①进入网页

②F12 或 Ctrl+Shift+C、打开开发者工具

③选择Application项目栏→Storage→Local Storage→对应页面IP

図3.png

双击Value值、进行复制操作、即可取得未解密的Access/Refresh Token值

図4.png


外层Base64方式解密

如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3ODkzNDYxMSwianRpIjoiN2JiOTE4NjYtZWVlYS00MTcxLThiNWYtMjZjODRkODNhNmEzIiwidHlwZSI6InJlZnJlc2giLCJzdWIiOiJyd3giLCJuYmYiOjE2Nzg5MzQ2MTEsImV4cCI6MTY5NDQ4NjYxMX0.Gz8ZsN1a4EeAqjM2JJEzAqYRcl4WzzzVRE9i09Fv5Xs

使用在线Base64解码/编码工具进行外层解密

https://base64.us/

図5.png

Base64解密前:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3ODkzNDYxMSwianRpIjoiN2JiOTE4NjYtZWVlYS00MTcxLThiNWYtMjZjODRkODNhNmEzIiwidHlwZSI6InJlZnJlc2giLCJzdWIiOiJyd3giLCJuYmYiOjE2Nzg5MzQ2MTEsImV4cCI6MTY5NDQ4NjYxMX0.Gz8ZsN1a4EeAqjM2JJEzAqYRcl4WzzzVRE9i09Fv5Xs

Base64解密后:

{"typ":"JWT","alg":"HS256"}{"fresh":false,"iat":1678934611,"jti":"7bb91866-eeea-4171-8b5f-26c84d83a6a3","type":"refresh","sub":"rwx","nbf":1678934611,"exp":1694486611}φl7Vઌ͉$L)\ϵQش[^

不难发现、三段式书写分布为:

①eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
②.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3ODkzNDYxMSwianRpIjoiN2JiOTE4NjYtZWVlYS00MTcxLThiNWYtMjZjODRkODNhNmEzIiwidHlwZSI6InJlZnJlc2giLCJzdWIiOiJyd3giLCJuYmYiOjE2Nzg5MzQ2MTEsImV4cCI6MTY5NDQ4NjYxMX0
③.Gz8ZsN1a4EeAqjM2JJEzAqYRcl4WzzzVRE9i09Fv5Xs

以 . 进行分割

实际测试中仅需更改第②部分的内容(第③部分内容需通过拼合HS256方式解密、此处不做说明)


Jwt内容解析

{"typ":"JWT","alg":"HS256"}{"fresh":false,"iat":1678934611,"jti":"7bb91866-eeea-4171-8b5f-26c84d83a6a3","type":"refresh","sub":"rwx","nbf":1678934611,"exp":1694486611}φl7Vઌ͉$L)\ϵQش[^

iat: 开始日期jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

sub: 面向的用户(jwt所面向的用户)

nbf: 生效日期定义在什么时间之前,该jwt都是不可用的.

exp: 过期日期戳(jwt的过期时间,这个过期时间必须要大于签发时间)

.

jwt所记录的日期以“秒”为单位、

可使用System.currentTimeMillis() 方法调用获取对应日期、

或以1970-1-1 00:00:00.000加上此秒数也可算出对应日期。

此处提供Unix 时间戳计算工具来进行计算

https://tool.lu/timestamp/

図6.png


Refresh Token的生命周期时长计算

以此举例:

{"typ":"JWT","alg":"HS256"}{"fresh":false,"iat":1678934611,"jti":"7bb91866-eeea-4171-8b5f-26c84d83a6a3","type":"refresh","sub":"rwx","nbf":1678934611,"exp":1694486611}φl7Vઌ͉$L)\ϵQش[^

过期日期戳为 "exp":1694486611

生效日期戳为 "nbf":1678934611

図7.png

不难解得:

此Refresh Token解密后为6个月


Token修改

因此、可以根据需要、将Access/Refresh Token进行更改

如:

{"fresh":false,"iat":1678934611,"jti":"7bb91866-eeea-4171-8b5f-26c84d83a6a3","type":"refresh","sub":"rwx","nbf":1678934611,"exp": 1678934911}

故Refresh Token将于300秒后的2023-03-16 10:48:31过期

Access Token同理

注:exp值不可小于nbf及iat值

更改完成后将第②段式明文Jwt内容使用Base64工具进行反加密

図8.png将加密后的将新的第②段式密文与未更改的原①③段式密文结合、粘贴回网页的Storage-Key对应栏中。

即可完成Access Token & Refresh Token的更改。

図9.png


効果一覧

此时刷新网页

①在Access Token过期后、被Refresh Token颁发新的Access Token、且实时RemoteREC画面保持。

②在Refresh Token过期后、返回Login画面、需要重新登录

図10.png図11.png