
Access/Refresh Token的获取与更改
Access/Refresh Token的获取与更改
Token标识概念引入
由于使用Http/Https协议访问网页、是无状态的会话、
为了辨别访问的用户身份、故有了Session和Cookie。
session
在服务器端记录、允许通过将对象存储在Web服务器的内存中、在整个用户对话过程中保持任何对象。
随着越来越多用户登录,Session所需要的服务器内存量也会不断增加。因此Cookie为此而生——
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。
Token的书写组成
——为三段式:
第一段:Header :公司信息,加密方式等
第二段:Payload:真正的加密数据、存放用户的信息
第三段:Signature:签名,通过第一段和第二段,通过加密方式加密得到的
通过JWT(Json web token)认证、是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准
如何取得Access/Refresh Token
①进入网页
②F12 或 Ctrl+Shift+C、打开开发者工具
③选择Application项目栏→Storage→Local Storage→对应页面IP
双击Value值、进行复制操作、即可取得未解密的Access/Refresh Token值
外层Base64方式解密
如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY3ODkzNDYxMSwianRpIjoiN2JiOTE4NjYtZWVlYS00MTcxLThiNWYtMjZjODRkODNhNmEzIiwidHlwZSI6InJlZnJlc2giLCJzdWIiOiJyd3giLCJuYmYiOjE2Nzg5MzQ2MTEsImV4cCI6MTY5NDQ4NjYxMX0.Gz8ZsN1a4EeAqjM2JJEzAqYRcl4WzzzVRE9i09Fv5Xs
使用在线Base64解码/编码工具进行外层解密
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 时间戳计算工具来进行计算
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
不难解得:
此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工具进行反加密
将加密后的将新的第②段式密文与未更改的原①③段式密文结合、粘贴回网页的Storage-Key对应栏中。
即可完成Access Token & Refresh Token的更改。
効果一覧
此时刷新网页
①在Access Token过期后、被Refresh Token颁发新的Access Token、且实时RemoteREC画面保持。
②在Refresh Token过期后、返回Login画面、需要重新登录