簡介:OAuth(Open Authorization)是一個開放標準,允許用戶授權第三方應用訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方應用。OAuth2是OAuth協(xié)議的延續(xù)版本,OAuth1已經被廢棄,現在OAuth2是用于授權的行業(yè)標準協(xié)議。 1. 四個角色 A. 客戶端(client):本身不存儲資源,需要通過資源擁有者的授權去請求資源服務器的資源,比如瀏覽器或內部服務; B. 資源擁有者(Resource Owner):通常為用戶,也可以是應用程序,他有訪問資源的賬號和秘鑰; C. 認證服務器(Authorization Server):用于服務提供商對資源擁有的身份進行認證、對訪問資源進行授權,認證成功后會給客戶端發(fā)放令牌 D. 資源服務器(Resource Server):擁有受保護的資源,如果請求包含正確的令牌,那就可以訪問資源,比如提供客戶端API的服務。 注意:服務提供商給接入方的身份憑據是:client_id(客戶端標識) + client_secret(客戶端秘鑰),用于不能隨便一個請求就能認證授權。 2. 運行流程 A. 客戶端請求第三方授權; B. 資源擁有者同意給客戶端授權; C. 客戶端獲取到授權碼,請求認證服務器申請令牌; D. 認證服務器認證授權碼無誤,同意向客戶端發(fā)放令牌; E. 客戶端使用令牌請求資源服務器的資源; F. 資源服務器認證令牌無誤,同意開放受保護的資源。 3. 授權模式 A. 授權碼模式(Authorization Code) 流程: 第一步:用戶訪問客戶端,將會跳轉到授權服務器; 第二步:用戶給予是否給客戶端授權; 第三步:若授權的話,授權服務器將跳轉到客戶端指定的URI,并同時提供授權碼; 第四步:客戶端收到授權碼,通過返回的URI,向認證服務器申請令牌; 第五步:認證服務器比對授權碼和重定向URI,認證無誤后,向客戶端發(fā)送訪問令牌和更新令牌。 使用場景:該模式是OAuth2最安全最完善的一種模式,可以實現服務之間的調用,比如微信,QQ等第三方登錄。 B. 密碼模式(Resource Owner Password Credentials) 流程: 第一步:將用戶名和密碼提供給客戶端; 第二步:客戶端攜帶用戶名和密碼發(fā)送給認證服務器申請令牌; 第三步:認證服務器認證無誤,向客戶端提供訪問令牌。 使用場景:客戶端不得存儲密碼,通常用在用戶對客戶端高度信任情況下。 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), 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) ); |
|