您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關oauth2快速入門過程是怎樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
需要 導入 易水公共組件 和 spring-security-oauth3-autoconfigure
兩個依賴
<dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth3-autoconfigure</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>com.yishuifengxiao.common</groupId> <artifactId>common-spring-boot-starter</artifactId> <version>4.1.2</version> </dependency>
@Configuration public class CustomOauth3Config extends OAuth3Config{ }
加上@EnableResourceServer
和 @EnableAuthorizationServer
注解
完全開啟示例代碼如下:
@Configuration @EnableWebSecurity @EnableResourceServer @EnableAuthorizationServer public class SecurityConfig extends AbstractSecurityConfig { @Override protected void configure(HttpSecurity http) throws Exception { // 調用父類中的默認配置 applyAuthenticationConfig(http); } @Configuration public class CustomOauth3Config extends OAuth3Config{ } }
實現UserDetailsService
接口 和 UserDetailsService
接口,完成自己的認證邏輯,并將其注入到spring 的上下文中
【特別注意】在用戶未按照此步驟配置自己的授權邏輯時,組件會默認進行一個缺省實現。在缺省實現的情況下,用戶能使用任意用戶名配合密碼(12345678)進行登錄
需要特別注意的是,在下面的授權方式之中,UserDetailsService
負責校驗clientId
和clientSecret
是否正確,UserDetailsService
負責校驗username
和password
是否正確。
完成前面的步驟之后,一個簡單的oauth3認證服務器就搭建完成了。
POST /oauth/token HTTP/1.1 Host: oauth3.yishuifengxiao.com Authorization: Basic fdsfdsfdsfds Content-Type: application/x-www-form-urlencoded grant_type=password&username=johndoe&password=A3ddj3w
在請求中,各參數的含義如下
grant_type:表示授權類型,此處的值固定為"password",必選項。
username:表示用戶名,必選項。
password:表示用戶的密碼,必選項。
scope:表示權限范圍,可選項。
Authorization: 請求頭參數 ,值是 clientId:clientSecret 經過 base64 編碼后的值
下面是一個響應的例子
{ "access_token": "BDF867DE69F05143C709", "token_type": "bearer", "refresh_token": "d7cda8fb15714209a9f9f3b039a0034f", "expires_in": 43199, "scope": "read write trust", "client_id": "yishui" }
POST /oauth/token HTTP/1.1 Host: oauth3.yishuifengxiao.com Authorization: Basic fdsfdsfdsfds Content-Type: application/x-www-form-urlencoded grant_type=client_credentials
在本請求中,各參數的含義如下
grant_type:表示授權類型,此處的值固定為"client_credentials",必選項。
Authorization: 請求頭參數 ,值是 clientId:clientSecret 經過 base64 編碼后的值
下面是一個響應的例子
{ "access_token": "BDF867DE69F05143D3BF", "token_type": "bearer", "expires_in": 43199, "scope": "read write trust", "client_id": "yishui" }
同密碼模式相比,客戶端模式的響應中缺少了
refresh_token
參數
授權碼模式首先需要保證 spring security 的登陸功能正常可用。只有開啟 spring security 的登陸功能可用,才能開啟授權碼功能。
先訪問一下請求
GET /oauth/authorize?response_type=code&client_id=yishui&state=xyz &redirect_uri=http://demo.yishuifengxiao.com/demo HTTP/1.1 Host: oauth3.yishuifengxiao.com
在本請求中,各參數的含義如下:
code:表示授權碼,必選項。該碼的有效期應該很短,通常設為 10 分鐘,客戶端只能使用該碼一次,否則會被授權服務器拒絕。該碼與客戶端 ID 和重定向 URI,是一一對應關系。
state:如果客戶端的請求中包含這個參數,認證服務器的回應也必須一模一樣包含這個參數。
client_id: 用戶的 client_id
在進行此請求時,假如用戶沒有登錄,spring security 會進行攔截,因此需要用戶先進行登錄。
在正常情況下,訪問以上請求會被重定向到
http://demo.yishuifengxiao.com/demo?code=fsfsdf &state=xyz
服務器回應客戶端的 URI,包含以下參數:
code:表示授權碼,必選項。該碼的有效期應該很短,通常設為 10 分鐘,客戶端只能使用該碼一次,否則會被授權服務器拒絕。該碼與客戶端 ID 和重定向 URI,是一一對應關系。
state:如果客戶端的請求中包含這個參數,認證服務器的回應也必須一模一樣包含這個參數。
通過上面的請求得到了code
以后,用戶需要使用下面請求獲取到授權碼
POST /oauth/token HTTP/1.1 Host: oauth3.yishuifengxiao.com Authorization: Basic fdsfdsfdsfds Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=fsfsdf &redirect_uri=demo.yishuifengxiao.com/demo
在本請求中,各參數的含義如下:
grant_type:表示使用的授權模式,必選項,此處的值固定為"authorization_code"。
code:表示上一步獲得的授權碼,必選項。
redirect_uri:表示重定向 URI,必選項,且必須與 A 步驟中的該參數值保持一致。
client_id:表示客戶端 ID,必選項。
GET /oauth/authorize?response_type=token&client_id=yishui&state=xyz &redirect_uri=http://demo.com/demo HTTP/1.1 Host: server.example.com
在本請求中,各參數的含義如下:
response_type:表示授權類型,此處的值固定為"token",必選項。
client_id:表示客戶端的 ID,必選項。
redirect_uri:表示重定向的 URI,可選項。
scope:表示權限范圍,可選項。
state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。
POST /oauth/token HTTP/1.1 Host: oauth3.yishuifengxiao.com Authorization: Basic fdsfdsfdsfds Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=sdff
請求中個參數的含義:
granttype:表示使用的授權模式,此處的值固定為"refreshtoken",必選項。
refresh_token:表示早前收到的更新令牌,必選項。
scope:表示申請的授權范圍,不可以超出上一次申請的范圍,如果省略該參數,則表示與上一次一致。
通過 前面的方法獲取到 access_token 之后,一般有兩種使用方法
將 access_token 做為請求參數攜帶在 url 參數上
http://demo.yishuifengxiao.com/user/123?access_token=獲得到的access_token
將 access_token 做為請求參數放在請求頭中
在所有需要授權的請求的請求頭里都攜帶上參數 Authorization=Bearer 獲得到的 access_token
在通用組件中,由于對access_token
進行了深度處理,因此用戶可以access_token
通過易水工具包里的 DES 工具飯解析出 token 里攜帶的信息。
在解密時需要使用的密鑰由【安全管理】中設置的yishuifengxiao.security.secret-key
屬性值決定。
下面是一個 access_token
的解密信息示例
{ "username": "yishui", "clientId": "admin", "roles": [ "ROLE_USER", "admin" ], "grantType": "password" }
解密信息的各參數的解釋:
username: 用戶登錄時使用到的用戶名(在客戶端模式下該值為空)
clientId: 用戶登錄時使用的 clientId(在簡化模式下該值為空)
roles: 此登錄用戶擁有的角色(即此用戶的 authorities)
grantType:access_token 對應的授權類型
由
access_token
反解析出用戶信息僅限于本組件,原生的 oauth3 的access_token
不支持此功能
上述就是小編為大家分享的oauth2快速入門過程是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。