簡(jiǎn)介:OAuth(Open Authorization)是一個(gè)開放標(biāo)準(zhǔn),允許用戶授權(quán)第三方應(yīng)用訪問他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方應(yīng)用。OAuth2是OAuth協(xié)議的延續(xù)版本,OAuth1已經(jīng)被廢棄,現(xiàn)在OAuth2是用于授權(quán)的行業(yè)標(biāo)準(zhǔn)協(xié)議。
1. 四個(gè)角色
A. 客戶端(client):本身不存儲(chǔ)資源,需要通過資源擁有者的授權(quán)去請(qǐng)求資源服務(wù)器的資源,比如瀏覽器或內(nèi)部服務(wù);
B. 資源擁有者(Resource Owner):通常為用戶,也可以是應(yīng)用程序,他有訪問資源的賬號(hào)和秘鑰;
C. 認(rèn)證服務(wù)器(Authorization Server):用于服務(wù)提供商對(duì)資源擁有的身份進(jìn)行認(rèn)證、對(duì)訪問資源進(jìn)行授權(quán),認(rèn)證成功后會(huì)給客戶端發(fā)放令牌access_token
,作為客戶端訪問資源服務(wù)器的憑據(jù);
D. 資源服務(wù)器(Resource Server):擁有受保護(hù)的資源,如果請(qǐng)求包含正確的令牌,那就可以訪問資源,比如提供客戶端API的服務(wù)。
注意:服務(wù)提供商給接入方的身份憑據(jù)是:client_id(客戶端標(biāo)識(shí)) + client_secret(客戶端秘鑰),用于不能隨便一個(gè)請(qǐng)求就能認(rèn)證授權(quán)。
2. 運(yùn)行流程
A. 客戶端請(qǐng)求第三方授權(quán);
B. 資源擁有者同意給客戶端授權(quán);
C. 客戶端獲取到授權(quán)碼,請(qǐng)求認(rèn)證服務(wù)器申請(qǐng)令牌;
D. 認(rèn)證服務(wù)器認(rèn)證授權(quán)碼無誤,同意向客戶端發(fā)放令牌;
E. 客戶端使用令牌請(qǐng)求資源服務(wù)器的資源;
F. 資源服務(wù)器認(rèn)證令牌無誤,同意開放受保護(hù)的資源。
3. 授權(quán)模式
A. 授權(quán)碼模式(Authorization Code)
流程:
第一步:用戶訪問客戶端,將會(huì)跳轉(zhuǎn)到授權(quán)服務(wù)器;
第二步:用戶給予是否給客戶端授權(quán);
第三步:若授權(quán)的話,授權(quán)服務(wù)器將跳轉(zhuǎn)到客戶端指定的URI,并同時(shí)提供授權(quán)碼;
第四步:客戶端收到授權(quán)碼,通過返回的URI,向認(rèn)證服務(wù)器申請(qǐng)令牌;
第五步:認(rèn)證服務(wù)器比對(duì)授權(quán)碼和重定向URI,認(rèn)證無誤后,向客戶端發(fā)送訪問令牌和更新令牌。
使用場(chǎng)景:該模式是OAuth2最安全最完善的一種模式,可以實(shí)現(xiàn)服務(wù)之間的調(diào)用,比如微信,QQ等第三方登錄。
B. 密碼模式(Resource Owner Password Credentials)
流程:
第一步:將用戶名和密碼提供給客戶端;
第二步:客戶端攜帶用戶名和密碼發(fā)送給認(rèn)證服務(wù)器申請(qǐng)令牌;
第三步:認(rèn)證服務(wù)器認(rèn)證無誤,向客戶端提供訪問令牌。
使用場(chǎng)景:客戶端不得存儲(chǔ)密碼,通常用在用戶對(duì)客戶端高度信任情況下。
C. 簡(jiǎn)化模式(Implicit)
D. 客戶端模式(Client Credentials)
流程:
第一步:客戶端(服務(wù),非用戶)向認(rèn)證服務(wù)器進(jìn)行身份驗(yàn)證,申請(qǐng)令牌;
第二部:認(rèn)證服務(wù)器認(rèn)證無誤,向客戶端提供訪問令牌。
使用場(chǎng)景:A服務(wù)本身需要B服務(wù)資源,與用戶無關(guān)。
4. sql語句
-- used in tests that use HSQLcreate 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), autoapprove VARCHAR(256));create table oauth_client_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256));create table oauth_access_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256), authentication LONGVARBINARY, refresh_token VARCHAR(256));create table oauth_refresh_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication LONGVARBINARY);create table oauth_code ( code VARCHAR(256), authentication LONGVARBINARY);create table oauth_approvals ( userId VARCHAR(256), clientId VARCHAR(256), scope VARCHAR(256), status VARCHAR(10), expiresAt TIMESTAMP, lastModifiedAt TIMESTAMP);-- customized oauth_client_details tablecreate table ClientDetails ( appId VARCHAR(256) PRIMARY KEY, resourceIds VARCHAR(256), appSecret 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), autoApproveScopes VARCHAR(256));
聯(lián)系客服