實作授權碼授權類型

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

授權碼是最常用的 OAuth 2.0 授權類型之一。授權 程式碼流程是「三足式 OAuth」此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定在這個設定中,使用者需進行驗證 存取資源伺服器,並授予應用程式同意聲明,允許應用程式存取受保護的資源 而非將使用者名稱/密碼提供給用戶端應用程式。

關於這個主題

本主題提供 OAuth 2.0 授權授權類型的一般說明與總覽 流程,並探討如何在 Apigee Edge 上實作此流程。

影片

請觀看短片,瞭解如何使用 OAuth 2.0 授權類型保護您的 API。

用途

這個授權類型適用於由第三方開發人員編寫的應用程式 與 API 供應商具有可靠的業務關係。舉例來說,如果開發人員 公用 API 計畫通常不應受到信任。採用這種授權類型時 資源伺服器上的憑證一律不會與應用程式共用。

程式碼範例

如需授權代碼授權類型的完整有效實作範例,請前往 GitHub 上 api-platform-samples 存放區中的 Apigee Edge。請參閱 OAuth-advanced 範例。請參閱 README 檔案以取得樣本的詳細資訊。

流程圖

以下流程圖說明使用 Apigee Edge 的授權碼 OAuth 流程 作為授權伺服器

提示:如要查看這張圖的較大版本,請在圖表上按一下滑鼠右鍵,然後以此方式開啟 或在圖片檢視器中開啟該分頁

授權碼流程中的步驟

以下摘要列出導入授權碼授權類型所需的步驟。 Apigee Edge 可做為授權伺服器。本流程的關鍵在於用戶端 一律無法查看資源伺服器上的使用者憑證。

必備條件:用戶端應用程式必須向 Apigee Edge 註冊,才能 取得用戶端 ID 和用戶端密鑰。參閱「註冊用戶端應用程式」 詳細資料。

1. 使用者啟動流程

當應用程式需要從資源伺服器存取使用者的受保護資源時 ( 例如社群媒體網站上的聯絡人清單) 會傳送 API 呼叫給 Apigee Edge 驗證用戶端的 ID,如果憑證有效,就會將使用者的瀏覽器重新導向到登入頁面 使用者將輸入憑證API 呼叫包含用戶端應用程式的資訊 註冊時取得的:用戶端 ID 和重新導向 URI。

2. 使用者輸入憑證

使用者現在會看到登入頁面,要求使用者輸入登入憑證。如果 才能進入下一步。

3. 使用者同意

在這個步驟中,使用者會同意應用程式存取自己的資源。同意書 通常包含範圍選項,可讓使用者選擇應用程式可執行的操作 資源伺服器例如,使用者可將唯讀權限授予對方, 更新資源

4. 登入應用程式 傳送要求 Apigee Edge

如果登入和同意成功,登入應用程式會將 POST 資料傳送至 /authorizationcode 以及 Apigee Edge 的端點這些資料包括重新導向 URI、用戶端 ID、範圍和任何特定使用者專屬 並表示登入成功。

5. Apigee Edge 產生授權碼

當 Edge 收到登入應用程式 (授權代碼端點) 傳送的 GET 要求時, 難免會遭遇困難首先,Edge 會檢查 HTTP 狀態或 其他方式)。接下來的 Edge 會檢查,確認從登入應用程式傳送的重新導向 URI 與在應用程式註冊 Apigee Edge 時指定的重新導向 URI 相符。如果 只要一切正常,Edge 就會產生授權碼。例如:

http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}

6. 邊緣 將授權碼傳回用戶端

Edge 會將驗證碼附加為查詢參數的 302 重新導向,傳送給 用戶端。

7. 用戶端會擷取授權碼,並向 Edge 要求存取碼

現在透過有效的驗證碼,用戶端可以從 Edge 要求存取權杖。做法是 發布用戶端 ID 和用戶端密鑰 (在應用程式註冊 Edge 時取得), 授權類型和範圍加入用戶端 ID 和密鑰後,Apigee Edge 就能驗證 用戶端應用程式是已註冊的應用程式例如:

$ curl https://{org_name}-test.apigee.net/my_oauth_proxy/accesstoken?code=Xyz123&grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpKNhGar6K&client_secret=hAr4GngA9vAyvI4'

8. 用戶端收到 存取權杖

如果一切成功,Edge 會將存取權杖傳回用戶端。此外,存取權杖 才有有效期限,而這個範圍只適用於使用者授予時 同意應用程式存取資源。

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

現在,透過有效的存取碼,用戶端就能呼叫受保護的 API。在本 情境、要求會傳送給 Apigee Edge (Proxy),而 Edge 負責驗證 存取權杖,再將 API 呼叫傳遞至目標資源伺服器。存取權杖 會透過 Authorization 標頭傳遞。例如:

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

設定流程和政策

做為授權伺服器,Edge 需要處理一些 OAuth 要求:存取權 權杖、驗證碼、重新整理權杖、登入頁面重新導向等項目 設定這些端點:

  • 建立自訂流程
  • 新增並設定 OAuthV2 政策

自訂流程設定

您通常會設定這個授權類型流程,以便每個步驟或「桌腳」流程的定義 透過 Apigee Edge Proxy 的流程每個流程都有端點和政策執行 需要 OAuth 特定工作,例如產生授權碼或存取權杖。適用對象 如以下 XML 所示,/oauth/authorizationcode 端點具有 名為 GenerateAuthCode 的 OAuthV2 政策 GenerateAuthorizationCode 作業已指定)。

顯示流程設定最簡單的方法就是使用 XML 範例。查看內嵌內容 每個流程的相關資訊。以下舉例說明流量和路徑的名稱 您可以自行設定另請參閱設定 OAuth 端點和政策,快速概略說明建立自訂流程所需的步驟 就像這樣

另請參閱範例 。

<Flows>
<Flow name="RedirectToLoginApp">
<!--
Publish this URI to developers to use for their 'login' link
-->
<Condition>proxy.pathsuffix == "/oauth/authorize"</Condition>
<Request>
<Step><Name>RedirectToLoginPage</Name></Step>
</Request>
</Flow>
<Flow name="GetAuthCode">
<!--
Call this URL from your Login app after you authenticate the user.
The policy will automatically return the auth code in the response to the
redirect_uri registered by the calling app
-->
<Condition>proxy.pathsuffix == "/oauth/authorizationcode"</Condition>
<Request>
<Step><Name>GenerateAuthCode</Name></Step>
</Request>
</Flow>
<Flow name="GetAccessToken">
<!-- This policy flow is triggered when the URI path suffix
matches /oauth/accesstoken. Publish this URL to app developers
to use when obtaining an access token using an auth code
-->
<Condition>proxy.pathsuffix == "/oauth/accesstoken"</Condition>
<Request>
<Step><Name>GenerateAccessToken</Name></Step>
</Request>
</Flow>
</Flows>

使用政策設定流程

每個端點都有相關聯的政策。我們來看看幾個政策範例。詳情請見 以及設定 OAuth 端點和政策,快速瀏覽新增 OAuthV2 政策所需的步驟總覽 到 Proxy 端點

登入重新導向

這是 /oauth/authorize 路徑。附加政策負責 將使用者重新導向登入應用程式,可讓使用者安全地驗證及授權 用戶端應用程式存取受保護的資源,不必輸入使用者名稱和密碼 用戶端應用程式。您可以運用服務呼叫政策、JavaScript、Node.js 。

用來發出請求的 API 呼叫為 GET,且需要查詢參數 client_id response_type、redirect_uri、範圍和狀態。

$ curl http://myorg-test.apigee.net/oauth/authorize?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}

取得驗證碼

這是 /oauth/authorizationcode 路徑。使用 OAuthV2 政策時, 已指定 GenerateAuthorizationCode 作業。

<OAuthV2 async="false" continueOnError="false" enabled="true" name="GetAuthCode">
    <DisplayName>GetAuthCode</DisplayName>
    <Operation>GenerateAuthorizationCode</Operation>
    <ExpiresIn>600000</ExpiresIn>
    <GenerateResponse/>
</OAuthV2>

用來取得授權碼的 API 呼叫是 GET,而且需要查詢參數 client_id、response_type 以及選用的範圍和狀態,如以下範例所示:

$curl http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&scope=scope1%20scope2&state={some_string}

取得存取權杖

這項政策已附加至 /oauth/accesstoken 路徑。使用 OAuthV2 政策。在本例中,Grant_type 參數是 會成為查詢參數:

<OAuthV2 name="GetAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>360000000</ExpiresIn> 
    <SupportedGrantTypes> 
        <GrantType>authorization_code</GrantType> 
    </SupportedGrantTypes> 
    <GrantType>request.queryparam.grant_type</GrantType> 
    <GenerateResponse/> 
</OAuthV2>

用來取得存取碼的 API 呼叫是 POST,且必須包含 client_id、 client_secret,Grant_type=authorization_code,以及選用範圍。例如:

$ curl https://{org_name}-test.apigee.net/oauth/accesstoken?grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpVKNhGar6K&client_secret=hAr4Gn0gA9vAyvI4'

這只是基本摘要。實際工作環境範例包含許多其他建構政策 例如編寫網址、進行轉換以及執行其他工作如果需要 可正常運作的專案

附加驗證存取權杖政策

附加 VerifyAccessToken 政策 (具有 VerifyAccessToken 作業的 OAuthV2 政策) ) 附加至任何存取受保護 API 的流程的起點,因此該 API 就會執行 收到受保護的資源要求時 系統會發送快訊進行邊緣檢查,確定每項要求都含有 有效的存取權杖否則系統會傳回錯誤。如需基本步驟,請參閱「驗證存取權杖」。

<OAuthV2 async="false" continueOnError="false" enabled="true" name="VerifyAccessToken">
    <DisplayName>VerifyAccessToken</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>VerifyAccessToken</Operation>
    <SupportedGrantTypes/>
    <GenerateResponse enabled="true"/>
    <Tokens/>
</OAuthV2>

呼叫受保護的 API

如要呼叫受 OAuth 2.0 安全機制保護的 API,您必須提供有效的存取權 產生下一個符記正確的模式是在 Authorization 標頭中加入憑證,如下所示:注意 該存取權杖又稱為「不記名權杖」。

$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \
  http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282 

另請參閱傳送 存取權杖