1. 程式人生 > 程式設計 >看完這篇文章,你如果還不知道怎麼設定Oauth2令牌過期時間算我輸

看完這篇文章,你如果還不知道怎麼設定Oauth2令牌過期時間算我輸

OAuth2所生成的AccessToken以及RefreshToken都存在過期時間,當在有效期內才可以拿來作為會話身份發起請求,否者認證中心會直接攔截無效請求提示已過期,那麼我們怎麼修改這個過期時間來滿足我們的業務場景呢?

目前一線大廠所使用的的AccessToken的有效期一般都是7200秒,也就是2小時,而且有獲取的次數限制,所以發起請求的一方必須通過一定的形式儲存到本地,以方便下一次發起請求時,寫入請求的header或者作為引數攜帶。

本章來講解下使用ApiBoot OAuth元件該怎麼去設定AccessToken的過期時間,針對memory(記憶體方式)、jdbc(資料庫)這兩種方式來講解,更多使用請參考官方檔案:

預設有效時長

ApiBoot OAuthmemory儲存方式下為每一個客戶端都提供了一個預設的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; } 複製程式碼

ClientApiBootOauthProperties的一個內部類,主要是提供了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

作者個人 部落格 使用開源框架 ApiBoot 助你成為Api介面服務架構師