看完這篇文章,你如果還不知道怎麼設定Oauth2令牌過期時間算我輸
OAuth2
所生成的AccessToken
以及RefreshToken
都存在過期時間,當在有效期內才可以拿來作為會話身份發起請求,否者認證中心
會直接攔截無效請求提示已過期
,那麼我們怎麼修改這個過期時間來滿足我們的業務場景呢?
目前一線大廠所使用的的AccessToken
的有效期一般都是7200秒
,也就是2小時
,而且有獲取的次數限制,所以發起請求的一方必須通過一定的形式儲存到本地,以方便下一次發起請求時,寫入請求的header
或者作為引數攜帶。
本章來講解下使用ApiBoot OAuth
元件該怎麼去設定AccessToken
的過期時間,針對memory
(記憶體方式)、jdbc
(資料庫)這兩種方式來講解,更多使用請參考官方檔案:
- ApiBoot OAuth官方檔案:apiboot.minbox.io/zh-cn/docs/…
預設有效時長
ApiBoot OAuth
在memory
儲存方式下為每一個客戶端
都提供了一個預設的AccessToken
有效時長,該配置在org.minbox.framework.api.boot.autoconfigure.oauth.ApiBootOauthProperties
,相關原始碼如下所示:
/**
* Oauth2 Client
* Used to configure multiple clients
*/
@Data
public static class Client {
/**
* oauth2 client id
*/
private String clientId = "ApiBoot";
/**
* oauth2 client secret
*/
private String clientSecret = "ApiBootSecret";
/**
* oauth2 client grant types
* default value is "password,refresh_token"
*/
private String[] grantTypes = new String[]{"password","refresh_token" };
/**
* oauth2 client scope
* default value is "api"
*/
private String[] scopes = new String[]{"api"};
/**
* oauth2 application resource id
* default value is "api"
*/
private String[] resourceId = new String[]{"api"};
/**
* oauth2 access token validity seconds
* default value is 7200 second
*/
private int accessTokenValiditySeconds = 7200;
}
複製程式碼
Client
是ApiBootOauthProperties
的一個內部類,主要是提供了OAuth2 客戶端
的相關配置欄位,通過spring-boot-configuration-processor
依賴將該類自動解析成配置元資料
,這樣我們在application.yml
輸入api.xxx
時可以得到相應的提示。
在Client
內部類中有一個欄位accessTokenValiditySeconds
,通過該欄位我們來修改該客戶端下所有使用者生成的AccessToken
預設過期時長,值得注意的是,這裡的配置值時間單位是秒
,7200秒 = 2小時
。
記憶體方式
在上面說到了,記憶體方式時ApiBoot OAuth
會使用ApiBootOauthProperties#Client
內部類的accessTokenValiditySeconds
欄位來配置過期時間,所以我們只需要在application.yml
新增如下配置即可:
api:
boot:
oauth:
clients:
- clientId: minbox
clientSecret: chapter
# 配置客戶端Token過期時長,單位:秒
accessTokenValiditySeconds: 43200
security:
users:
- username: yuqiyu
password: 123123
複製程式碼
在上面配置中,我們添加了一個在記憶體儲存的minbox
客戶端,設定accessTokenValiditySeconds
過期時間欄位為43200秒 = 12小時
。
JDBC方式
JDBC
方式是ApiBoot OAuth
無法控制的,因為OAuth2
當使用JDBC
方式進行儲存客戶端、令牌等資訊時,都是通過OAuth2
提供的固定的表進行操作,正因為如此我們只需要修改oauth_client_details
表內每一條client
資訊的access_token_validity
欄位的值即可,時間單位同樣也是秒
,如下圖所示:
OAuth2
提供的MySQL
版本的建表語句請訪問ApiBoot OAuth Starter檢視。
執行測試
下面來測試下修改後的過期時間是否已經生效,我們先來啟動本章的專案示例。
通過CURL
的方式獲取AccessToken
,如下所示:
➜ ~ curl -X POST minbox:chapter@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123123'
{"access_token":"41127985-1b31-4413-ac9f-30d5e26f4aaf","token_type":"bearer","refresh_token":"0a39ca6a-8697-4f80-9bb1-ac59894a45dd","expires_in":43199,"scope":"api"}
複製程式碼
通過PostMan
方式獲取AccessToken
如下圖所示:
我們根據結果可以看到,由原本預設的7200
修改成了我們在application.yml
配置的43200
(結果中的43199
是因為生成token耗時差導致的)。
敲黑板,劃重點
ApiBoot
的宗旨就是化繁為簡,能使用配置簡單搞定的事情,絕不拖泥帶水,趕快分享下本篇文章吧,讓更多人得到幫助,非常感謝~~~
ApiBoot OAuth
可以一次配置多個客戶端,並且為每一個客戶端配置不同的過期時間。
簽到送書活動進行中
自律改變人生,恆宇少年回饋粉絲,給大家的福利,請訪問blog.yuqiyu.com/welfare/瞭解詳情。
程式碼示例
如果您喜歡本篇文章請為原始碼倉庫點個Star
,您的點贊是對我最大的支援,謝謝!!!
本篇文章示例原始碼可以通過以下途徑獲取,目錄為apiboot-oauth-set-token-expire-time
:
- Gitee:gitee.com/minbox-proj…