SpringBoot + Spring Security OAuth2基本使用
基本配置
maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.luoq</groupId>
<artifactId>test_oauth</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test_oauth</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
認證服務器 Authorization Server
在過OAuth2.0有一個服務提供商,新建一個類,並添加相應的註解
@Configuration
@EnableAuthorizationServer
public class MyAuthorizationServerConfig {
}
隨後我們啓動項目,就會發現控制檯有如下的語句打印:
這就表明Authorization Server已經建立起來了。我們可根據OAuth的規則來訪問相應的接口。
第三方應用 User authenticates
在有了服務提供商之後,我們就可以根據OAuth的規則,來要求用戶給予授權。 這裏我們以code模式爲例。 所以這裏需要第三方應用去調用接口
這裏對接口參數做一個簡單的介紹。
- localhost:8080 這裏是我服務的地址以及端口,根據每個人的情況是不同的
- /oauth/authorize 這個是Spring Security OAuth2默認提供的接口
- response_type:表示授權類型,必選項,此處的值固定爲”code”
- client_id: 表示客戶端的ID,必選項。這裏使用的是項目啓動時,控制檯輸出的security.oauth2.client.clientId,當然該值可以在配置文件中自定義
- redirect_uri:表示重定向URI,可選項。即用戶授權成功後,會跳轉的地方,通常是第三方應用自己的地址
- scope:表示申請的權限範圍,可選項。這一項用於服務提供商區分提供哪些服務數據
- state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。這裏沒有使用到該值
這裏我們訪問到接口後,會出現如下的界面,該界面用於用戶登錄
springboot securyt 默認的用戶名和密碼
用戶名:user
密碼在控制檯,每次啓動的時候會生成一個隨機的密碼,如下:
輸入用戶名和密碼,點擊登錄後,出現如下的界面:
這裏就是要求用戶授權的界面了,有點類似於我們使用百度、QQ、微信等進行第三方登錄時候的界面,這裏是簡易版。
我們這裏就點確認授權,這裏就會根據配置的redirect_uri
進行跳轉,並且是帶有一個參數的。
選擇Deny會跳轉: https://www.baidu.com/?error=access_denied&error_description=User%20denied%20access
選擇Approve會跳轉: https://www.baidu.com/?code=ePQZAz
這個code就是下一步第三方應用向服務器申請令牌使用的
請求Token
這裏我們拿着上一步獲取到的code,以及控制檯打印的clientId和secret去獲取Token。 這裏需要使用POST方法
請求的Header中有一個Authorization參數,該參數的值是Basic + (clientId:secret Base64值)
- grant_type:表示使用的授權模式,必選項,此處的值固定爲”authorization_code”。
- code:表示上一步獲得的授權碼,必選項。
- redirect_uri:表示重定向URI,必選項,且必須與獲取code步驟中的該參數值保持一致。
如果請求成功,就可以順利的拿到Token
- access_token:表示訪問令牌,必選項。
- token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。
- expires_in:表示過期時間,單位爲秒。如果省略該參數,必須其他方式設置過期時間。
- refresh_token:表示更新令牌,用來獲取下一次的訪問令牌,可選項。
- scope:表示權限範圍,如果與客戶端申請的範圍一致,此項可省略。
資源服務器
和認證服務器一樣,這裏實現資源服務器就很容易了
@Configuration
@EnableResourceServer
public class MyResourceServerConfig {
}
這樣我們就可以用Token來訪問接口了。
例如:
GET /user HTTP/1.1
Host: localhost:8082
Authorization: bearer 9b2aaea4-d161-4636-8883-6756a372e735
這裏Authorization中,bearer 是上一步返回的token_type。