這里的3行代碼并不是指真的只需要寫(xiě)3行代碼,而是基于我已經(jīng)寫(xiě)好的一個(gè)spring boot oauth2服務(wù)。僅僅需要修改3行數(shù)據(jù)庫(kù)配置信息,即可得到一個(gè)spring boot oauth2服務(wù)。
項(xiàng)目地址 https://github.com/jeesun/oauthserver
oauthserver
簡(jiǎn)介
oauthserver是一個(gè)基于spring boot oauth2的完整的獨(dú)立的oauth服務(wù)器。僅僅需要?jiǎng)?chuàng)建相關(guān)數(shù)據(jù)表,修改數(shù)據(jù)庫(kù)的連接信息,你就可以得到一個(gè)oauth服務(wù)器。
支持的關(guān)系型數(shù)據(jù)庫(kù):
- postgresql
- mysql
已實(shí)現(xiàn)的功能:
- 集成spring boot oauth2,實(shí)現(xiàn)oauth服務(wù);
- token保存到關(guān)系型數(shù)據(jù)庫(kù);
- 日志記錄保存到文件,并按日歸檔;
- 數(shù)據(jù)庫(kù)連接信息加密;
- 集成druid數(shù)據(jù)庫(kù)連接池。
使用流程
1. 建表
postgresql
請(qǐng)執(zhí)行src/main/resources/schema-pg.sql,完成數(shù)據(jù)表的創(chuàng)建和測(cè)試數(shù)據(jù)的導(dǎo)入。
mysql
請(qǐng)執(zhí)行src/main/resources/schema-mysql.sql,完成數(shù)據(jù)表的創(chuàng)建和測(cè)試數(shù)據(jù)的導(dǎo)入。
2. 修改數(shù)據(jù)庫(kù)連接信息
在application.yml中,配置著數(shù)據(jù)庫(kù)的連接信息。其中,配置項(xiàng)username和password是要經(jīng)過(guò)jasypt加密的,不能直接填明文。加密密鑰由jasypt.encryptor.password配置。你需要使用test目錄下的utiltests工具得到加密字符串。
1
2
3
4
5
6
7
8
9
10
11
12
|
postgresql # postgresql連接信息 driver- class -name: org.postgresql.driver url: jdbc:postgresql: //127.0.0.1:5432/thymelteuseunicode=true&characterencoding=utf-8 username: enc(htpbg9fq+7p3sntmxuntdxbtwdqrupv+) password: enc(abdq6lyospryfqhcqzemtxrozyjvjia4) mysql # mysql連接信息 driver- class -name: com.mysql.jdbc.driver url: jdbc:mysql: //127.0.0.1:3306/testuseunicode=true&characterencoding=utf-8&usessl=false username: enc(yiyjvwtuldgn //yab3kbua==) password: enc(9oaijkfggsdfahh3oxy63rhwq+amdmij) |
3. 運(yùn)行
現(xiàn)在,一切已準(zhǔn)備就緒。運(yùn)行項(xiàng)目,當(dāng)程序成功啟動(dòng)時(shí),即表明你已配置成功。
4. 測(cè)試
在建表時(shí),我已經(jīng)向表添加了測(cè)試數(shù)據(jù)。以下請(qǐng)求參數(shù)的值,均是測(cè)試數(shù)據(jù),在數(shù)據(jù)表中可以找得到。請(qǐng)根據(jù)需求到數(shù)據(jù)表中修改對(duì)應(yīng)的值。
在表oauth_client_details表中,已有一條測(cè)試數(shù)據(jù)。列client_id和client_secret的值,分別對(duì)應(yīng)basic oauth的請(qǐng)求參數(shù)username和password的值。而列access_token_validity和列refresh_token_validity,分別代表access_token和refresh_token的有效期時(shí)間,以秒為單位。測(cè)試數(shù)據(jù)7200和5184000,分別代表2個(gè)小時(shí)和2個(gè)月(60天)。這是一個(gè)比較合理的有效期時(shí)間的設(shè)置,可以參考。
token相關(guān)的接口,都需要進(jìn)行basic oauth認(rèn)證。
1、根據(jù)用戶名和密碼獲取access_token
post http://localhost:8182/oauth/tokengrant_type=password&username=jeesun&password=1234567890c
成功示例:
1
2
3
4
5
6
7
|
{ "access_token" : "ca582cd1-be6c-4a5a-82ec-10af7a8e06eb" , "token_type" : "bearer" , "refresh_token" : "c24a6143-97c8-4642-88b9-d5c5b902b487" , "expires_in" : 3824 , "scope" : "read write trust" } |
失敗示例(用戶名或者密碼錯(cuò)誤)
1
2
3
4
|
{ "error" : "invalid_grant" , "error_description" : "bad credentials" } |
2、檢查access_token
get http://localhost:8182/oauth/check_tokentoken=ca582cd1-be6c-4a5a-82ec-10af7a8e06eb
成功示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
{ "aud" : [ "oauth2-resource" ], "exp" : 1524507296 , "user_name" : "jeesun" , "authorities" : [ "role_admin" , "role_user" ], "client_id" : "clientidpassword" , "scope" : [ "read" , "write" , "trust" ] } |
失敗示例(access_token已過(guò)期)
1
2
3
4
|
{ "error" : "invalid_token" , "error_description" : "token was not recognised" } |
3、根據(jù)refresh_token獲取新的access_token
post http://localhost:8182/oauth/tokengrant_type=refresh_token&refresh_token=c24a6143-97c8-4642-88b9-d5c5b902b487
成功示例
1
2
3
4
5
6
7
|
{ "access_token" : "690ecd7d-f2b7-4faa-ac45-5b7a319478e8" , "token_type" : "bearer" , "refresh_token" : "c24a6143-97c8-4642-88b9-d5c5b902b487" , "expires_in" : 7199 , "scope" : "read write trust" } |
app實(shí)踐指南
app獲取到token信息后,需要保存token信息和請(qǐng)求時(shí)間。在傳access_token之前,需要檢查access_token是否過(guò)期。為了減少后臺(tái)壓力,檢查access_token是否過(guò)期應(yīng)該是在app本地完成。通過(guò)token的keyexpires_in(剩余有效期)的值,以及本地記錄的請(qǐng)求時(shí)間,和當(dāng)前時(shí)間做對(duì)比,可以很方便地判斷出access_token是否過(guò)期。如果過(guò)期了,需要通過(guò)refresh_token獲取新的access_token。因?yàn)閍ccess_token的有效期只有2個(gè)小時(shí),這個(gè)驗(yàn)證是必須的。refresh_token同理。
總結(jié)
以上所述是小編給大家介紹的3行代碼快速實(shí)現(xiàn)spring boot oauth2服務(wù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:https://www.jianshu.com/p/20488e032771