這裏的3行代碼並非指真的只須要寫3行代碼,而是基於我已經寫好的一個Spring Boot Oauth2服務。僅僅須要修改3行數據庫配置信息,便可獲得一個Spring Boot Oauth2服務。html
項目地址https://github.com/jeesun/oauthserverjava
oauthserver是一個基於Spring Boot Oauth2的完整的獨立的Oauth微服務。僅僅須要建立相關數據表,修改數據庫的鏈接信息,你就能夠獲得一個Oauth微服務。mysql
支持的關係型數據庫:git
已實現的功能:github
自定義Oauth2Exception異常返回的json信息。spring
bug修復。sql
獲取token時,username容許傳用戶名、手機號或者郵箱。數據庫
完成基礎Oauth服務。json
src/main/resources/schema-pg.sql
,完成數據表的建立和測試數據的導入。MySQL
請執行src/main/resources/schema-mysql.sql
,完成數據表的建立和測試數據的導入。oracle
jasypt.encryptor.password
配置。你須要使用test目錄下的UtilTests工具獲得加密字符串。# 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鏈接信息 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
如今,一切已準備就緒。運行項目,當程序成功啓動時,即代表你已配置成功。
在建表時,我已經向表添加了測試數據。如下請求參數的值,均是測試數據,在數據表中能夠找獲得。請根據需求到數據表中修改對應的值。
在表oauth_client_details
表中,已有一條測試數據。列client_id
和client_secret
的值,分別對應Basic Oauth的請求參數username
和password
的值。而列access_token_validity
和列refresh_token_validity
,分別表明access_token和refresh_token的有效期時間,以秒爲單位。測試數據7200和5184000,分別表明2個小時和2個月(60天)。這是一個比較合理的有效期時間的設置,能夠參考。
token相關的接口,都須要進行Basic Oauth認證。
以下圖所示:
一、根據用戶名和密碼獲取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" }
失敗示例
{ "code": 400, "message": "用戶名不存在", "data": null }
{ "code": 400, "message": "密碼錯誤", "data": null }
{ "code": 400, "message": "您已被封號", "data": null }
二、檢查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 }
三、根據refresh_token獲取新的access_token
成功示例
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獲取到token信息後,須要保存token信息和請求時間。在傳access_token以前,須要檢查access_token是否過時。爲了減小後臺壓力,檢查access_token是否過時應該是在app本地完成。經過token的keyexpires_in
(剩餘有效期)的值,以及本地記錄的請求時間,和當前時間作對比,能夠很方便地判斷出access_token是否過時。若是過時了,須要經過refresh_token獲取新的access_token。由於access_token的有效期只有2個小時,這個驗證是必須的。 refresh_token同理。