實作密碼授權類型

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

資源擁有者密碼 (或「密碼」) 授權類型主要在應用程式受到高度信任時使用。在這項設定中,使用者會將資源伺服器憑證 (使用者名稱/密碼) 提供給用戶端應用程式,然後透過存取權杖要求將憑證傳送至 Apigee Edge。身分識別伺服器會驗證憑證,如果憑證有效,Edge 就會繼續挖掘存取權杖,並將權杖傳回應用程式。

關於這個主題

本主題提供 OAuth 2.0 資源擁有者密碼授權類型流程的一般說明與總覽,並探討如何在 Apigee Edge 中實作此流程。

可能對您有幫助的範例

  • 要求存取權杖:密碼授權類型:說明如何建立權杖要求、設定 OAuthV2 政策來授予密碼授權類型,以及如何在 Edge 中設定政策端點。
  • oauth-validate-key-secret:GitHub 的 Proxy 範例,可部署至 Edge 並試用。這是以密碼授權類型的端對端範例。該範例示範了最佳做法,也就是先驗證用戶端應用程式的憑證 (金鑰/密鑰),然後再將使用者的憑證傳送至識別資訊提供者。

影片

影片: 觀看這部影片,瞭解如何實作密碼授權類型。

應用情境

這種授權類型適用於高度信任或具有特殊權限的應用程式,因為使用者必須在應用程式中提供資源伺服器憑證。應用程式通常會提供登入畫面,讓使用者在該處輸入憑證。

流程圖

下列流程圖說明資源擁有者密碼授權類型流程,以 Apigee Edge 服務做為授權伺服器。

提示:如要查看較大版本的圖表,請按一下滑鼠右鍵,並在新分頁中開啟圖表,或是儲存圖表並在圖片檢視器中開啟。

密碼授權類型流程中的步驟

以下摘要說明實作密碼授權類型 (Apigee Edge 做為授權伺服器) 的必要步驟。

事前準備:用戶端應用程式必須向 Apigee Edge 註冊,才能取得用戶端 ID 和用戶端密鑰。詳情請參閱「註冊用戶端應用程式」。

1. 使用者啟動流程並輸入憑證

如果應用程式需要存取使用者的受保護資源 (例如使用者在應用程式中點選按鈕),系統會將使用者重新導向至登入表單。

2. 應用程式向 Apigee Edge 要求存取權杖

應用程式會將存取權杖要求 (包括使用者憑證) 傳送至 Apigee Edge 上的 GenerateAccessToken 端點。

以下是 POST 要求的範例,其中包含這個授權類型的必要參數:

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

或者,該指令也可以如下所示使用 -u 選項以 curl 為您建立採用 Base64 編碼的基本驗證標頭。

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -u sqH8ooHexTz8C02IX9ORo6rhgq1iSrAl:Z4ljtJdneBOjPMAU \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

(這些指令應全部在同一行列出)。

使用者憑證包含在表單參數中,而用戶端憑證則是在 HTTP 基本驗證標頭中編碼。如需這項 API 呼叫的詳細說明,包括必要基本驗證標頭的詳細資料,請參閱「要求存取權杖和授權碼」中的「密碼授權」一節。

3. Edge 會驗證用戶端應用程式

Edge 必須先知道發出要求的用戶端應用程式是可信任的有效應用程式,然後再將使用者的使用者名稱和密碼傳送給識別資訊提供者。方法很簡單,只要對 API 呼叫使用 API 金鑰驗證即可。在某些情況下,您可能會想驗證用戶端金鑰和密鑰。 GitHub 上的 api-platform-samples 存放區中提供了範例 Proxy 來說明這個聯合技術。

4. Edge 會處理登入憑證

用戶端應用程式通過驗證後,您就可以使用服務呼叫或 JavaScript 政策呼叫身分服務,並傳送使用者的憑證。舉例來說,它可以是 LDAP 服務,或者您想用來驗證憑證的任何服務。如要進一步瞭解這些政策,請參閱「擷取變數政策」和「JavaScript 政策」。

如果身分識別服務驗證憑證並傳回 200 回應,Edge 會繼續處理要求,否則 Edge 會停止處理要求,並將錯誤傳回用戶端應用程式。

5. 系統會執行 OAuthV2 政策

如果憑證有效,下一步就會執行為密碼授權類型設定的 OAuthV2 政策。我們來看個例子您必須有 <UserName> 和 <PassWord> 元素,且可以從透過 ExtractVariables 政策儲存的流程變數中擷取這些元素。如要進一步瞭解這項政策的參考資料,請參閱 OAuthV2 政策

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>360000000</ExpiresIn> 
  <SupportedGrantTypes> 
     <GrantType>password</GrantType> 
  </SupportedGrantTypes> 
  <GrantType>request.queryparam.grant_type</GrantType> 
  <UserName>login</UserName>
  <PassWord>password</PassWord>
  <GenerateResponse/> 
</OAuthV2>

如果這項政策成功,系統會產生回應給包含存取權杖的用戶端。回應採用 JSON 格式。舉例來說,請注意,access_token 是其中一個元素:

{
    "issued_at": "1420258685042",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420258685042",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799",
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6",
    "organization_name": "docs",
    "refresh_token_expires_in": "0",
    "refresh_count": "0"
}

6. 用戶端會呼叫受保護的 API

現在,只要具備有效的存取碼,用戶端就能呼叫受保護的 API。在這個情境中,要求會向 Apigee Edge (Proxy) 發出,且 Edge 會負責驗證存取權杖,然後再將 API 呼叫傳送至目標資源伺服器。存取權杖會透過「授權」標頭傳遞。例如:

$ curl -H "Authorization: Bearer I6daIgMSiUgYX1K2qgQWPi37ztS6
" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282