1. 程式人生 > >4種認證(authentication)或授權(authorization)方式

4種認證(authentication)或授權(authorization)方式

Authentication vs. authorization
It is easy to confuse authentication with another element of the security plan: authorization. While authentication verifies the user’s identity, authorization verifies that the user in question has the correct permissions and rights to access the requested resource. As you can see, the
two work together. Authentication occurs first, then authorization.

authentication 認證訪問者是誰
authorization 訪問許可權

authentication 一般包含兩個步驟,第一步,使用者需要安裝服務提供的授權證書,或者使用者需要使用API服務中已經儲存的某個賬戶,也可以建立一個;第二步,每次傳送請求到API服務時需要帶上證書,因為RESTful API 是不會記錄客戶端與服務端的會話,無狀態限制。

有些認證技術還涉註冊,客戶端需要安裝證書,並且按需要安裝使用者個人的證書,客戶端需要將客戶端的證書和使用者證書一起攜帶傳送請求。

Basic Authentication

HTTP Basic authentication is described in RFC 2617. It’s a simple username/password scheme. 將使用者名稱與密碼進行Base64轉碼,但這種轉碼是可逆的。某些爬蟲工具可能會獲取這些請求資訊,直接獲取使用者的賬號和密碼,如果採用HTTPS方式傳送請求,每次請求和響應會被SSL加密,爬蟲無法獲取這些資訊。另一個問題,由於API通常不能信任使用者使用的客戶端,如果使用者在多個裝置(平板、電腦、手機)中登入了這個API服務,其中一個裝置出現安全問題,需要修改密碼,那麼其他裝置也需要重新登入才行。為了解決第二個問題,需要對每個裝置給予不同的證書。

OAuth

OAuth 是一種授權框架,能夠讓應用通過HTTP 服務獲取有限的訪問,訪問使用者賬號資訊,例如Facebook, GitHub, DigitalOcean都採用該技術。它可以委託認證服務授權第三方應用訪問自己的賬號資訊。OAuth2 相比OAuth 1,可以在PC端、移動端裝置上使用。

OAuth 定義了四種角色:
1. 資源所屬者,User, 擁有該資源的人,擁有Application所訪問資源的許可權。
2. 客戶端, Application, 需要訪問使用者賬號資訊的應用
3. 資源伺服器, API
4. 授權伺服器, API

OAuth 抽象版流程圖
這裡寫圖片描述

在應用(Application/Client)使用OAuth前需要在Service API 註冊該應用。需要在Service中提交應用的資訊:名稱、網站、授權後的跳轉URL。

當應用註冊後,Service會發布“client credentials”客戶端證書,包括client identifier 和 client secret. Client ID 是公開的字串,提供ServiceAPI標識該應用,並且用來構建呈現給使用者的授權URLs。 Client Secret用來認證Application向ServiceAPI的發起訪問使用者賬號資訊的請求,需要確保Application與API之間的隱私。

Authorization Grant (許可權授予方式) 在上圖的第一步中有許可權授予操作。OAuth2 提供四種授予許可權的方式,根據不用場景使用:
1. Authorization Code: 在服務端應用採用
2. Implicit: 移動端APP,Web應用
3. Resource Owner Password Credentials: 在可信任的應用中使用
4. Client Credential:應用訪問API採用的

Authorization Code Flow
這裡寫圖片描述

第一步,使用者 訪問授權請求的連結,例如

  • API 授權點
  • client_id: client_id,
  • redirect_uri=CALLBACK_URL
  • response_type=code, 指定應用的授權的方式,採用authorization code grant 方式
  • scope=read. 指定訪問的等級

第二步,授權應用後,會獲取authorization code
第三步,根據code換取 token

Token Authentication

JWT( JSON Web Token), 是一種以Base64編碼json物件的token,加密,緊湊且自成一體(self-contained),用於在網路中兩個節點之間傳遞資訊。開源標準(RFC 7519

JWT由三個部分組成:
1. Header, 定義加密演算法型別(例如:HS256)、定義型別(JWT)
2. Payload, 定義token攜帶的主要資訊
3. Signature, 建立token的簽名,

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

OpenID