OAuth2 單點登入

2021-10-08 10:42:27 字數 3150 閱讀 6434

簡介:oauth(open authorization)是乙個開放標準,允許使用者授權第三方應用訪問他們儲存在另外的服務提供者上的資訊,而不需要將使用者名稱和密碼提供給第三方應用。oauth2是oauth協議的延續版本,oauth1已經被廢棄,現在oauth2是用於授權的行業標準協議。

1. 四個角色

a. 客戶端(client):本身不儲存資源,需要通過資源擁有者的授權去請求資源伺服器的資源,比如瀏覽器或內部服務;

b. 資源擁有者(resource owner):通常為使用者,也可以是應用程式,他有訪問資源的賬號和秘鑰;

c. 認證伺服器(authorization server):用於服務提供商對資源擁有的身份進行認證、對訪問資源進行授權,認證成功後會給客戶端發放令牌access_token,作為客戶端訪問資源伺服器的憑據;

d. 資源伺服器(resource  server):擁有受保護的資源,如果請求包含正確的令牌,那就可以訪問資源,比如提供客戶端api的服務。

注意:服務提供商給接入方的身份憑據是:client_id(客戶端標識) + client_secret(客戶端秘鑰),用於不能隨便乙個請求就能認證授權。

2. 執行流程

a. 客戶端請求第三方授權;

b. 資源擁有者同意給客戶端授權;

c. 客戶端獲取到授權碼,請求認證伺服器申請令牌;

d. 認證伺服器認證授權碼無誤,同意向客戶端發放令牌;

e. 客戶端使用令牌請求資源伺服器的資源;

f. 資源伺服器認證令牌無誤,同意開放受保護的資源。

3. 授權模式

a. 授權碼模式(authorization code)

流程:第一步:使用者訪問客戶端,將會跳轉到授權伺服器;

第二步:使用者給予是否給客戶端授權;

第三步:若授權的話,授權伺服器將跳轉到客戶端指定的uri,並同時提供授權碼;

第四步:客戶端收到授權碼,通過返回的uri,向認證伺服器申請令牌;

第五步:認證伺服器比對授權碼和重定向uri,認證無誤後,向客戶端傳送訪問令牌和更新令牌。

b. 密碼模式(resource owner password credentials)

流程:第一步:將使用者名稱和密碼提供給客戶端;

第二步:客戶端攜帶使用者名稱和密碼傳送給認證伺服器申請令牌;

第三步:認證伺服器認證無誤,向客戶端提供訪問令牌。

使用場景:客戶端不得儲存密碼,通常用在使用者對客戶端高度信任情況下。

c. 簡化模式(implicit)

d. 客戶端模式(client credentials)

流程:第一步:客戶端(服務,非使用者)向認證伺服器進行身份驗證,申請令牌;

第二部:認證伺服器認證無誤,向客戶端提供訪問令牌。

使用場景:a服務本身需要b服務資源,與使用者無關。

4. sql語句

-- used in tests that use hsql

create table oauth_client_details (

client_id varchar(256) primary key,

resource_ids varchar(256),

client_secret varchar(256),

scope varchar(256),

authorized_grant_types varchar(256),

web_server_redirect_uri varchar(256),

authorities varchar(256),

access_token_validity integer,

refresh_token_validity integer,

additional_information varchar(4096),

);create table oauth_client_token (

token_id varchar(256),

token lon**arbinary,

authentication_id varchar(256) primary key,

user_name varchar(256),

client_id varchar(256)

);create table oauth_access_token (

token_id varchar(256),

token lon**arbinary,

authentication_id varchar(256) primary key,

user_name varchar(256),

client_id varchar(256),

authentication lon**arbinary,

refresh_token varchar(256)

);create table oauth_refresh_token (

token_id varchar(256),

token lon**arbinary,

authentication lon**arbinary

);create table oauth_code (

code varchar(256), authentication lon**arbinary

); userid varchar(256),

clientid varchar(256),

scope varchar(256),

status varchar(10),

expiresat timestamp,

lastmodifiedat timestamp

);-- customized oauth_client_details table

create table clientdetails (

resourceids varchar(256),

scope varchar(256),

granttypes varchar(256),

redirecturl varchar(256),

authorities varchar(256),

access_token_validity integer,

refresh_token_validity integer,

additionalinformation varchar(4096),

);

SSO 單點登入CAS與OAuth2

在系統開發初期,系統很少,每個系統都有自己的登入模組,使用者直接使用自己的賬號進行登入即可。但當功能不斷完善,為了合理利用資源並降低耦合性,往往需要將單系統拆分為多個子系統。以阿里系的 為例,乙個 背後有眾多的子系統,使用者的一次交易或操作往往可能需要十多甚至幾十個子系統的協作,如果每個子系統都需要...

深入OAuth2 微服務下的SSO單點登入

在前兩篇部落格中介紹了oauth2和springsecurity的基本知識,本篇介紹oauth2協議實現的sso單點登入。認證伺服器的配置和之前的差不多,把客戶端資訊存到了資料中,不在是記憶體裡 這個請求最終不會被zuul 到後端伺服器 requestcontext.setsendzuulrespo...

CAS的單點登入和oauth2的最大區別

cas的單點登入時保障客戶端的使用者資源的安全 oauth2則是保障服務端的使用者資源的安全 cas客戶端要獲取的最終資訊是,這個使用者到底有沒有許可權訪問我 cas客戶端 的資源。oauth2獲取的最終資訊是,我 oauth2服務提供方 的使用者的資源到底能不能讓你 oauth2的客戶端 訪問 c...