簡介: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)去請求資源服務(wù)器的資源,比如瀏覽器或內(nèi)部服務(wù); B. 資源擁有者(Resource Owner):通常為用戶,也可以是應(yīng)用程序,他有訪問資源的賬號(hào)和秘鑰; C. 認(rèn)證服務(wù)器(Authorization Server):用于服務(wù)提供商對資源擁有的身份進(jìn)行認(rèn)證、對訪問資源進(jìn)行授權(quán),認(rèn)證成功后會(huì)給客戶端發(fā)放令牌 D. 資源服務(wù)器(Resource Server):擁有受保護(hù)的資源,如果請求包含正確的令牌,那就可以訪問資源,比如提供客戶端API的服務(wù)。 注意:服務(wù)提供商給接入方的身份憑據(jù)是:client_id(客戶端標(biāo)識(shí)) + client_secret(客戶端秘鑰),用于不能隨便一個(gè)請求就能認(rèn)證授權(quán)。 2. 運(yùn)行流程 A. 客戶端請求第三方授權(quán); B. 資源擁有者同意給客戶端授權(quán); C. 客戶端獲取到授權(quán)碼,請求認(rèn)證服務(wù)器申請令牌; D. 認(rèn)證服務(wù)器認(rèn)證授權(quán)碼無誤,同意向客戶端發(fā)放令牌; E. 客戶端使用令牌請求資源服務(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ù)器申請令牌; 第五步:認(rèn)證服務(wù)器比對授權(quán)碼和重定向URI,認(rèn)證無誤后,向客戶端發(fā)送訪問令牌和更新令牌。 使用場景:該模式是OAuth2最安全最完善的一種模式,可以實(shí)現(xiàn)服務(wù)之間的調(diào)用,比如微信,QQ等第三方登錄。 B. 密碼模式(Resource Owner Password Credentials) 流程: 第一步:將用戶名和密碼提供給客戶端; 第二步:客戶端攜帶用戶名和密碼發(fā)送給認(rèn)證服務(wù)器申請令牌; 第三步:認(rèn)證服務(wù)器認(rèn)證無誤,向客戶端提供訪問令牌。 使用場景:客戶端不得存儲(chǔ)密碼,通常用在用戶對客戶端高度信任情況下。 C. 簡化模式(Implicit)
D. 客戶端模式(Client Credentials) 流程: 第一步:客戶端(服務(wù),非用戶)向認(rèn)證服務(wù)器進(jìn)行身份驗(yàn)證,申請令牌; 第二部:認(rèn)證服務(wù)器認(rèn)證無誤,向客戶端提供訪問令牌。 使用場景:A服務(wù)本身需要B服務(wù)資源,與用戶無關(guān)。 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), 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 table create 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) ); |
|