关于 JWT 写登录授权接口的分析

科技与生活 Hack Jc 本文由博客端 https://www.remixjc.cn 主动推送
本贴最后更新于 214 天前,其中的信息可能已经渤澥桑田

前情概要

目前已经实现了一版逻辑,想要在这个基础上进行更多更多的细节扩展,比如扩展 token 的保存时间,这时候就需要增加 refresh_token 来请求新的 token 数据

解决方案

解决方案这里分两种情况说明,当前的解决方案、扩展的解决方案

当前的解决方案

当前的解决方案主要是基于标准的 JWT 加密的 token 返回,设置时限(这里以 30 分钟为例),利用 Redis 存储双倍的时间来进行后续接口请求的验证,如果超过时限但是在 2 倍时限之内的话,返回对应的授权需要重新请求的状态码,当判断获取到状态码之后,用现有的 token 去请求刷新接口,这个接口验证 token 时验证是否在时限和双倍时限之间,如果是,重新返回新的 token,如果 token 超过了双倍时限,那么则拒绝请求,必须重新请求登录授权获取。
这里的 Redis 中存储的键值可以做一些处理,来验证 token 信息的可靠性
防止 token 被利用,所以时间可以尽可能的少一些

扩展的解决方案构思

首先是按照正常方式来授权获取 token,同时不带 access_token 及 refresh_token,两种 token 中得数据类型不同,其中得加密方式也可以不同,在拦截器中判断传入的方式从而实现不同的业务逻辑。
在刷新 token 时,会作废掉 refresh_token,这样可以保证长期登录,如果超过一个月不登陆,那么在 Redis 里面的数据就会消失,因为在 Redis 里面保存了最长 30 天的数据,而 access_token 则只保存 2 小时

最终接口形态

1. 登录授权

请求方式:POST

数据格式:JSON

请求参数:

参数 描述
username 登录用户名
smscode 短信验证码

响应结果:

{  
    "code": 200,  
    "data": {  
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzU1NDAxMDk5NDgsInBheWxvYWQiOiJ7XCJtZXJjaGFudGlkXCI6MTEwMixcIm5hbWVcIjpcIuWFqOaZr-inhuinieWKoOebn1wiLFwiaWRcIjoxMTAyMDAwMSxcImFnZW5jeW5vXCI6XCIwMDMwMDFcIixcImVtYWlsXCI6XCIxMjNAMTIzLmNuXCJ9In0.TfnSxoXbHs4ckaI-M1i8AmmDCTWWp52x3BTcYdqNNBA",  
        "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzgxMjQ5MDk5NzksInBheWxvYWQiOiJ7XCJ1c2VybmFtZVwiOlwiMTUwMTExNDUyMDBcIn0ifQ.Aao1veTc_DEQLih2EmxjBf2B80LO4b4zgA6lgxloR_4",  
        "expires_in": 7200,  
        "info": {  
            "merchantid": 1102,  
            "name": "name",  
            "id": 11020001,  
            "agencyno": "003001",  
            "email": "123@[123.cn](http://123.cn/)"  
        }  
    },  
    "message": "Ok"  
}

2.刷新授权

请求方式:POST

数据格式:JSON

| :-- | :-- | :-- |
| app-refresh-token | Header | 登录授权时获取到的 refresh_token 值,正常可以保存 30 天,当使用刷新授权后,该 refresh_token 失效,再次请求刷新请使用最新获取到 refresh_token,如果请求都不可用,则需要用户重新登录,该内容需要客户端严格保存 |
| app-access-token | Header | 登录授权时获取到的 access_token 值,正常保存 2 小时,2 小时后失效,失效后需要调用该接口用 refresh_token 获取最新并保存到客户端 |

响应结果:

{  
    "code": 200,  
    "data": {  
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzU1NDAxMDk5NDgsInBheWxvYWQiOiJ7XCJtZXJjaGFudGlkXCI6MTEwMixcIm5hbWVcIjpcIuWFqOaZr-inhuinieWKoOebn1wiLFwiaWRcIjoxMTAyMDAwMSxcImFnZW5jeW5vXCI6XCIwMDMwMDFcIixcImVtYWlsXCI6XCIxMjNAMTIzLmNuXCJ9In0.TfnSxoXbHs4ckaI-M1i8AmmDCTWWp52x3BTcYdqNNBA",  
        "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzgxMjQ5MDk5NzksInBheWxvYWQiOiJ7XCJ1c2VybmFtZVwiOlwiMTUwMTExNDUyMDBcIn0ifQ.Aao1veTc_DEQLih2EmxjBf2B80LO4b4zgA6lgxloR_4",  
        "expires_in": 7200  
    },  
    "message": "Ok"  
}
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    11 引用 • 10 回帖 • 7 关注

赞助商 我要投放

3 回帖
请输入回帖内容 ...
  • jinghong

    Spring security OAuth 有 jwt 和 Redistrollface

  • someone55059

    这么多字,真是不容易。

  • someone

    写的有点儿仓促,还有待整理