一、簡介#
OAth2是一個標准的授權協議。
在認證與授權的過程中,主要包含以下3種角色。
- 服務提供方 Authorization Server。
- 資源持有者 Resource Server。
- 客戶端 Client。
OAuth2的認證流程如圖所示,具體如下。
(1)用戶(資源持有者)打開客戶端 ,客戶端詢問用戶授權。
(2)用戶同意授權。
(3)客戶端向授權服務器申請授權。
(4)授權服務器對客戶端進行認證,也包括用戶信息的認證,認證成功后授權給予令牌。
(5)客戶端獲取令牌后,攜帶令牌向資源服務器請求資源。
(6)資源服務器確認令牌正確無誤,向客戶端釋放資源。
OAuth2 Provider 的角色被分為 Authorization Server(授權服務)和 Resource Service(資源服務),通常它們不在同一個服務中,可能一個 Authorization Service 對應多個 Resource Service。Spring OAuth2 需配合 Spring Security 一起使用,所有的請求由 Spring MVC 控制器處理,並經過一系列的Spring Security過濾器。
在Spring Security過濾器鏈中有以下兩個節點,這兩個節點是向 Authorization Service 獲取驗證和授權的。
- 授權節點:默認為 /oauth/authorize。
- 獲取Token節點:默認為 /oauth/token。
二、快速開始#
2.1 新建本地數據庫#
客戶端信息可以存儲在數據庫中,這樣就可以通過更改數據庫來實時更新客戶端信息的數據。Spring OAuth2 已經設計好了數據庫的表,且不可變。
/* Navicat MySQL Data Transfer Source Host : localhost Source Database : spring-cloud-auth Target Server Version : 50718 File Encoding : utf-8 */ SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `clientdetails` -- ---------------------------- DROP TABLE IF EXISTS `clientdetails`; CREATE TABLE `clientdetails` ( `appId` varchar(128) NOT NULL, `resourceIds` varchar(256) DEFAULT NULL, `appSecret` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `grantTypes` varchar(256) DEFAULT NULL, `redirectUrl` varchar(256) DEFAULT NULL, `authorities` varchar(256) DEFAULT NULL, `access_token_validity` int(11) DEFAULT NULL, `refresh_token_validity` int(11) DEFAULT NULL, `additionalInformation` varchar(4096) DEFAULT NULL, `autoApproveScopes` varchar(256) DEFAULT NULL, PRIMARY KEY (`appId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_access_token` -- ---------------------------- DROP TABLE IF EXISTS `oauth_access_token`; CREATE TABLE `oauth_access_token` ( `token_id` varchar(256) DEFAULT NULL, `token` blob, `authentication_id` varchar(128) NOT NULL, `user_name` varchar(256) DEFAULT NULL, `client_id` varchar(256) DEFAULT NULL, `authentication` blob, `refresh_token` varchar(256) DEFAULT NULL, PRIMARY KEY (`authentication_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_approvals` -- ---------------------------- DROP TABLE IF EXISTS `oauth_approvals`; CREATE TABLE `oauth_approvals` ( `userId` varchar(256) DEFAULT NULL, `clientId` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `status` varchar(10) DEFAULT NULL, `expiresAt` datetime DEFAULT NULL, `lastModifiedAt` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_client_details` -- ---------------------------- DROP TABLE IF EXISTS `oauth_client_details`; CREATE TABLE `oauth_client_details` ( `client_id` varchar(256) NOT NULL, `resource_ids` varchar(256) DEFAULT NULL, `client_secret` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `authorized_grant_types` varchar(256) DEFAULT NULL, `web_server_redirect_uri` varchar(256) DEFAULT NULL, `authorities` varchar(256) DEFAULT NULL, `access_token_validity` int(11) DEFAULT NULL, `refresh_token_validity` int(11) DEFAULT NULL, `additional_information` varchar(4096) DEFAULT NULL, `autoapprove` varchar(256) DEFAULT NULL, PRIMARY KEY (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_client_token` -- ---------------------------- DROP TABLE IF EXISTS `oauth_client_token`; CREATE TABLE `oauth_client_token` (