3行代碼快速實現Spring Boot Oauth2 Server服務


這里的3行代碼並不是指真的只需要寫3行代碼,而是基於我已經寫好的一個Spring Boot Oauth2服務。僅僅需要修改3行數據庫配置信息,即可得到一個Spring Boot Oauth2服務。

項目地址https://github.com/jeesun/oauthserver

oauthserver

簡介

oauthserver是一個基於Spring Boot Oauth2的完整的獨立的Oauth微服務。僅僅需要創建相關數據表,修改數據庫的連接信息,你就可以得到一個Oauth微服務。

支持的關系型數據庫:

  • PostgreSQL
  • MySQL

已實現的功能:

  1. 集成Spring Boot Oauth2,實現Oauth服務;
  2. token保存到關系型數據庫;
  3. 獲取token時,username允許傳用戶名、手機號或者郵箱;
  4. 日志記錄保存到文件,並按日歸檔;
  5. 數據庫連接信息加密;
  6. 集成Druid數據庫連接池;
  7. 自定義Oauth2Exception異常返回的json信息。

更新日志

v1.1.0(2018-06-01)

  • 自定義Oauth2Exception異常返回的json信息。

v1.0.3

  • bug修復。

v1.0.1

  • 獲取token時,username允許傳用戶名、手機號或者郵箱。

v1.0.0

  • 完成基礎Oauth服務。

使用流程

1. 建表

  • PostgreSQL
    請執行src/main/resources/schema-pg.sql,完成數據表的創建和測試數據的導入。
  • MySQL
    請執行src/main/resources/schema-mysql.sql,完成數據表的創建和測試數據的導入。

2. 修改數據庫連接信息

在application.yml中,配置着數據庫的連接信息。其中,配置項username和password是要經過jasypt加密的,不能直接填明文。加密密鑰由jasypt.encryptor.password配置。你需要使用test目錄下的UtilTests工具得到加密字符串。

  • PostgreSQL
# PostgreSQL連接信息
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5432/thymelte?useUnicode=true&characterEncoding=UTF-8
    username: ENC(hTpbG9fq+7P3SntmXuNtDxbtWDqRuPV+) #明文postgres
    password: ENC(abdq6LyOspryFQHCqzEMTxRozyJVjIA4) #明文19961120
  • MySQL
# MySQL連接信息
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: ENC(YiYjVwTulDGN//YaB3KbuA==) #明文root
    password: ENC(9oaIJkFgGSDFaHH3OXY63RHWQ+amDmiJ) #明文19941017

3. 運行

現在,一切已准備就緒。運行項目,當程序成功啟動時,即表明你已配置成功。

4. 測試

在建表時,我已經向表添加了測試數據。以下請求參數的值,均是測試數據,在數據表中可以找得到。請根據需求到數據表中修改對應的值。
在表oauth_client_details表中,已有一條測試數據。列client_idclient_secret的值,分別對應Basic Oauth的請求參數usernamepassword的值。而列access_token_validity和列refresh_token_validity,分別代表access_token和refresh_token的有效期時間,以秒為單位。測試數據7200和5184000,分別代表2個小時和2個月(60天)。這是一個比較合理的有效期時間的設置,可以參考。

token相關的接口,都需要進行Basic Oauth認證。
如下圖所示:
輸入圖片說明

1、根據用戶名和密碼獲取access_token

POST http://localhost:8182/oauth/token?grant_type=password&username=jeesun&password=1234567890c

成功示例
status=200,返回的json數據:

{
    "access_token": "ca582cd1-be6c-4a5a-82ec-10af7a8e06eb",
    "token_type": "bearer",
    "refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
    "expires_in": 3824,
    "scope": "read write trust"
}

失敗示例

  1. 用戶名錯誤
    status=400,返回的json數據:
{
    "code": 400,
    "message": "用戶名不存在",
    "data": null
}
  1. 密碼錯誤
    status=400,返回的json數據:
{
    "code": 400,
    "message": "密碼錯誤",
    "data": null
}
  1. 賬號被封enabled=false
    status=400,返回的json數據:
{
    "code": 400,
    "message": "您已被封號",
    "data": null
}

2、檢查access_token

GET http://localhost:8182/oauth/check_token?token=ca582cd1-be6c-4a5a-82ec-10af7a8e06eb

成功示例
即使用戶被封enabled=false,access_token未過期仍然可用。
status=200,返回的json數據:

{
    "aud": [
        "oauth2-resource"
    ],
    "exp": 1524507296,
    "user_name": "jeesun",
    "authorities": [
        "ROLE_ADMIN",
        "ROLE_USER"
    ],
    "client_id": "clientIdPassword",
    "scope": [
        "read",
        "write",
        "trust"
    ]
}

失敗示例
access_token已過期
status=400,返回的json數據:

{
    "code": 400,
    "message": "Token was not recognised",
    "data": null
}

3、根據refresh_token獲取新的access_token

POST http://localhost:8182/oauth/token?grant_type=refresh_token&refresh_token=c24a6143-97c8-4642-88b9-d5c5b902b487

成功示例
status=200,返回的json數據:

{
    "access_token": "690ecd7d-f2b7-4faa-ac45-5b7a319478e8",
    "token_type": "bearer",
    "refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
    "expires_in": 7199,
    "scope": "read write trust"
}

失敗示例
用戶被封enabled=false
status=401,返回的json數據:

{
    "code": 401,
    "msg": "用戶已失效",
    "data": null
}

app實踐指南

app獲取到token信息后,需要保存token信息和請求時間。在傳access_token之前,需要檢查access_token是否過期。為了減少后台壓力,檢查access_token是否過期應該是在app本地完成。通過token的keyexpires_in(剩余有效期)的值,以及本地記錄的請求時間,和當前時間做對比,可以很方便地判斷出access_token是否過期。如果過期了,需要通過refresh_token獲取新的access_token。因為access_token的有效期只有2個小時,這個驗證是必須的。
refresh_token同理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM