溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

3行代碼快速實(shí)現(xiàn)Spring Boot Oauth2服務(wù)功能

發(fā)布時(shí)間:2020-09-27 01:56:02 來源:腳本之家 閱讀:224 作者:五毛程序員 欄目:編程語言

這里的3行代碼并不是指真的只需要寫3行代碼,而是基于我已經(jīng)寫好的一個(gè)Spring Boot Oauth3服務(wù)。僅僅需要修改3行數(shù)據(jù)庫配置信息,即可得到一個(gè)Spring Boot Oauth3服務(wù)。

項(xiàng)目地址https://github.com/jeesun/oauthserver

oauthserver

簡(jiǎn)介

oauthserver是一個(gè)基于Spring Boot Oauth3的完整的獨(dú)立的Oauth服務(wù)器。僅僅需要?jiǎng)?chuàng)建相關(guān)數(shù)據(jù)表,修改數(shù)據(jù)庫的連接信息,你就可以得到一個(gè)Oauth服務(wù)器。

支持的關(guān)系型數(shù)據(jù)庫

已實(shí)現(xiàn)的功能:

  1. 集成Spring Boot Oauth3,實(shí)現(xiàn)Oauth服務(wù);
  2. token保存到關(guān)系型數(shù)據(jù)庫;
  3. 日志記錄保存到文件,并按日歸檔;
  4. 數(shù)據(jù)庫連接信息加密;
  5. 集成Druid數(shù)據(jù)庫連接池。

使用流程

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ù)庫連接信息

在application.yml中,配置著數(shù)據(jù)庫的連接信息。其中,配置項(xiàng)username和password是要經(jīng)過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+)
  password: ENC(abdq6LyOspryFQHCqzEMTxRozyJVjIA4)
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==)
  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/token?grant_type=password&username=jeesun&password=1234567890c

成功示例:

{
  "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ò)誤)

{
  "error": "invalid_grant",
  "error_description": "Bad credentials"
}

2、檢查access_token

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

成功示例

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

失敗示例(access_token已過期)

{
  "error": "invalid_token",
  "error_description": "Token was not recognised"
}

3、根據(jù)refresh_token獲取新的access_token

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

成功示例

{
  "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是否過期。為了減少后臺(tái)壓力,檢查access_token是否過期應(yīng)該是在app本地完成。通過token的keyexpires_in(剩余有效期)的值,以及本地記錄的請(qǐng)求時(shí)間,和當(dāng)前時(shí)間做對(duì)比,可以很方便地判斷出access_token是否過期。如果過期了,需要通過refresh_token獲取新的access_token。因?yàn)閍ccess_token的有效期只有2個(gè)小時(shí),這個(gè)驗(yàn)證是必須的。refresh_token同理。

總結(jié)

以上所述是小編給大家介紹的3行代碼快速實(shí)現(xiàn)Spring Boot Oauth3服務(wù),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI