OAuth 2.0 トークンを取得する

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントを表示する。

このドキュメントでは、Apigee API を使用して OAuth 2.0 アクセス トークンと認証コードを取得する方法について説明します。また、OAuth 2.0 付与タイプごとにポリシーを作成し、クライアント リクエストを受け入れるようにプロキシ エンドポイントを構成する方法についても説明します。

認証コード権限付与タイプを使用する

このセクションでは、認証コード権限付与タイプフローを使用してアクセス トークンを取得する方法について説明します。このフローのトークン リクエストには認証コードが必要です。認証コードを取得するをご覧ください。OAuth 2.0 の権限付与タイプとはもご覧ください。

リクエストの例

curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
   -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
   -X POST 'https://apitest.acme.com/oauth/token' \
   -d 'code=I9dMGHAN&grant_type=authorization_code&redirect_uri=http://example-callback.com' 

必須パラメータ

デフォルトでは、これらのパラメータを x-www-form-urlencoded とし、リクエスト本文で指定する必要があります(上記のサンプルを参照)。ただし、OAuthV2 ポリシーで <GrantType> 要素、<Code> 要素、<RedirectUri> 要素を構成することで、このデフォルトを変更できます。OAuthV2 ポリシーをご覧ください。

  • grant_type - 値を authorization_code に設定する必要があります。
  • code - 認証コード。認証コードのリクエストをご覧ください。
  • redirect_uri - 認証コード リクエストに redirect_uri パラメータが含まれている場合は、このパラメータを指定する必要があります。redirect_uri パラメータが認証コード リクエストに含まれていなかった場合で、このパラメータを指定しない場合、このポリシーは登録済みのデベロッパー アプリで指定されるコールバック URL の値を使用します。

オプション パラメータ

  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

クライアント ID とクライアント シークレットを Basic 認証ヘッダー(Base64 でエンコードされたもの)、またはフォーム パラメータ client_idclient_secret として渡す必要があります。これらの値は、登録済みのデベロッパー アプリから取得します。Basic 認証の認証情報をエンコードするもご覧ください。

サンプル エンドポイント

ここでは、アクセス トークンを生成するためのエンドポイント構成のサンプルを示します。これにより実行される GenerateAccessToken ポリシーは、authorization_code 権限付与タイプをサポートするよう構成する必要があります。

...
       <Flow name="generate-access-token">
            <Description>Generate a token</Description>
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

サンプル ポリシー

これは、authorization_code 権限付与タイプを受け入れるように構成された基本的な GenerateAccessToken ポリシーです。このポリシーを使用して構成できる任意の構成要素については、OAuthV2 ポリシーをご覧ください。

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn>
    <RefreshTokenExpiresIn>86400000</RefreshTokenExpiresIn>
    <SupportedGrantTypes>
      <GrantType>authorization_code</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

戻り値

<GenerateResponse> を有効にすると、ポリシーは、以下のとおりアクセス トークンを含む JSON レスポンスを返します。authorization_code 権限付与タイプでは、アクセス トークンとリフレッシュ トークンが作成されるため、レスポンスは次のようになります。

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

<GenerateResponse> が false に設定されている場合、このポリシーはレスポンスを返しません。代わりに、以下のフロー変数のセットにアクセス トークン付与に関するデータを入力します。

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

次に例を示します。

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

クライアント認証情報の権限付与タイプを使用する

このセクションでは、クライアント認証情報権限付与タイプフローを使用してアクセス トークンを取得する方法について説明します。OAuth 2.0 の権限付与タイプとはもご覧ください。

リクエストの例

curl -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ" \
  -X POST "https://apitest.acme.com/oauth/token" \
  -d "grant_type=client_credentials"

必須パラメータ

  • grant_type - 値を client_credentials に設定する必要があります。

    デフォルトでは、必須の grant_type パラメータは x-www-form-urlencoded であり、リクエストの本文(上の例で示す)で指定することが必要です。ただし、OAuthV2 ポリシーで <GrantType> 要素を構成することにより、このデフォルトを変更できます。たとえば、パラメータをクエリ パラメータで渡すことが可能です。詳しくは、OAuthV2 ポリシーをご覧ください。

オプション パラメータ

  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

クライアント ID とクライアント シークレットを Basic 認証ヘッダー(Base64 でエンコードされたもの)、またはフォーム パラメータ client_idclient_secret として渡す必要があります。これらの値は、リクエストに関連付けられた、登録済みのデベロッパー アプリから取得します。基本認証用の認証情報のエンコードもご覧ください。

サンプル エンドポイント

ここでは、アクセス トークンを生成するためのエンドポイント構成のサンプルを示します。これにより GenerateAccessToken ポリシーが実行されます。このポリシーは、client_credentials 付与タイプをサポートするように構成する必要があります。

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

サンプル ポリシー

これは、client_credentials 権限付与タイプを受け入れるように構成された基本的な GenerateAccessToken ポリシーです。このポリシーを使用して構成できる任意の構成要素については、OAuthV2 ポリシーをご覧ください。

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <SupportedGrantTypes>
      <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

戻り値

<GenerateResponse> が有効な場合、このポリシーは JSON レスポンスを返します。なお、権限付与タイプが client_credentials の場合、リフレッシュ トークンはサポートされません。アクセス トークンだけが作成されます。次に例を示します。

{
    "issued_at": "1420260525643",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "XkhU2DFnMGIVL2hvsRHLM00hRWav",
    "organization_name": "docs"
}

<GenerateResponse> が false に設定されている場合、このポリシーはレスポンスを返しません。代わりに、以下のフロー変数のセットにアクセス トークン付与に関するデータを入力します。

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds

次に例を示します。

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in     //--in seconds

パスワード権限付与タイプを使用する

このセクションでは、リソース所有者パスワード認証情報(password)権限付与タイプフローを使用して、アクセス トークンを取得する方法について説明します。パスワード権限付与タイプを実装するもご覧ください。OAuth 2.0 の権限付与タイプとはもご覧ください。

リクエストの例

curl -v -k -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ" \
  -X POST "https://apitest.acme.com/oauth/token" \
  -d "grant_type=password&username=a_username&password=a_password"

必須パラメータ

デフォルトでは、これらのパラメータを x-www-form-urlencoded とし、リクエスト本文で指定する必要があります(上記のサンプルを参照)。ただし、OAuthV2 ポリシーで <GrantType> 要素、<Username> 要素、<Password> 要素を構成することで、このデフォルトを変更できます。OAuthV2 ポリシーをご覧ください。

ユーザー認証情報は、通常は LDAP または JavaScript ポリシーを使用して格納された認証情報に照らして検証されます。

  • grant_type - 値を password に設定する必要があります。
  • username - リソース所有者のユーザー名。
  • password - リソース所有者のパスワード。

オプション パラメータ

  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

クライアント ID とクライアント シークレットを Basic 認証ヘッダー(Base64 でエンコードされたもの)、またはフォーム パラメータ client_idclient_secret として渡す必要があります。これらの値は、リクエストに関連付けられた、登録済みのデベロッパー アプリから取得します。基本認証用の認証情報のエンコードもご覧ください。

サンプル エンドポイント

ここでは、アクセス トークンを生成するためのエンドポイント構成のサンプルを示します。これにより実行される GenerateAccessToken ポリシーは、パスワード権限付与タイプをサポートするよう構成されている必要があります。

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

サンプル ポリシー

これは、パスワード権限付与タイプを受け入れるように構成された基本的な GenerateAccessToken ポリシーです。このポリシーを使用して構成できる任意の構成要素については、OAuthV2 ポリシーをご覧ください。

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
    <SupportedGrantTypes>
      <GrantType>password</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

戻り値

<GenerateResponse> が有効な場合、このポリシーは JSON レスポンスを返します。パスワード権限付与タイプを使用すると、アクセス トークンとリフレッシュ トークンの両方が作成されます。次に例を示します。

{
    "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", //--in seconds
    "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": "28799", //--in seconds
    "refresh_count": "0"
}

<GenerateResponse> が false に設定されている場合、このポリシーはレスポンスを返しません。代わりに、以下のフロー変数のセットにアクセス トークン付与に関するデータを入力します。

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

次に例を示します。

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

暗黙的権限付与タイプを使用する

このセクションでは、暗黙的権限付与タイプフローを使用してアクセス トークンを取得する方法について説明します。OAuth 2.0 の権限付与タイプとはもご覧ください。

リクエストの例

$ curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  'https://apitest.acme.com/oauth/implicit?response_type=token&client_id=c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ&redirect_uri=http://callback-example.com'

必須パラメータ

デフォルトでは、これらのパラメータをクエリ パラメータとする必要があります(上記のサンプルを参照)。ただし、この /token エンドポイントに接続された OAuthV2 ポリシーで <ResponseType> 要素、<ClientId> 要素、<RedirectUri> 要素を構成することで、このデフォルトを変更できます。詳しくは、OAuthV2 ポリシーをご覧ください。

ユーザー認証情報は、通常は LDAP サービス コールアウトまたは JavaScript ポリシーを使用して格納された認証情報に照らして検証されます。

  • response_type - 値を token に設定する必要があります。
  • client_id - 登録されたデベロッパー アプリのクライアント ID。
  • redirect_uri - クライアントのデベロッパー アプリが登録されたときにコールバック URI が提供されなかった場合は、このパラメータを必ず指定してください。コールバック URL がクライアント登録時に指定された場合は、この値と比較して完全一致しなければなりません。

オプション パラメータ

  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

認証ヘッダーは必要ありませんが、リクエスト パラメータとしてクライアント ID を渡す必要があります。

サンプル エンドポイント

ここでは、アクセス トークンを生成するためのエンドポイント構成のサンプルを示します。これにより GenerateAccessTokenImplicitGrant ポリシーが実行されます。

...
       <Flow name="generate-access-token-implicit">
            <Request>
                <Step>
                    <Name>GenerateAccessTokenImplicitGrant</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/implicit") and (request.verb = "POST")</Condition>
        </Flow>
...

サンプル ポリシー

これは、暗黙的権限付与タイプフローでトークン リクエストを処理する基本的な GenerateAccessTokenImplicitGrant ポリシーです。このポリシーを使用して構成できる任意の構成要素については、OAuthV2 ポリシーをご覧ください。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="GenerateAccessTokenImplicit">
    <DisplayName>GenerateAccessTokenImplicit</DisplayName>
    <Operation>GenerateAccessTokenImplicitGrant</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

戻り値

<GenerateResponse> が有効な場合、ポリシーはレスポンス ヘッダーで 302 ロケーション リダイレクトを返します。このリダイレクトは、redirect_uri パラメータで指定された URL を指し、アクセス トークンとトークンの有効期限が付加されます。暗黙的付与タイプはリフレッシュ トークンをサポートしないことにご留意ください。次に例を示します。

https://callback-example.com#expires_in=1799&access_token=In4dKm4ueoGZRbIYJhC9yZCmTFw5

<GenerateResponse> が false に設定されている場合、このポリシーはレスポンスを返しません。代わりに、以下のフロー変数のセットにアクセス トークン付与に関するデータを入力します。

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in  //--in seconds

次に例を示します。

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in   //--in seconds

認証コードを取得する

認証コード権限付与タイプフローでは、アクセス トークンを取得するために認証コードが必要です。認証コード権限付与タイプを使用するをご覧ください。OAuth 2.0 の権限付与タイプとはもご覧ください。

リクエストの例

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
  "https://apitest.acme.com/oauth/authorize?response_type=code&client_id=c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ&redirect_uri=http://my-callback.com"

必須パラメータ

デフォルトでは、これらのパラメータはクエリ パラメータであることが必要です(上のサンプルを参照)。ただし、OAuthV2 ポリシーに <ResponseType> 要素、<ClientId> 要素、<RedirectUri> 要素を構成することで、このデフォルトを変更できます。詳しくは、OAuthV2 ポリシーをご覧ください。

  • redirect_uri - コールバック URI 全体(一部ではなく)が登録済みのクライアント アプリで指定されている場合、このパラメータは任意です。コールバック URI 全体が指定されていない場合は必須です。コールバックは、作成した認証コードを Apigee が送信する URL です。アプリの登録と API キーの管理をご覧ください。
  • response_type - 値を code に設定する必要があります。
  • client_id - 登録されたデベロッパー アプリのクライアント ID。

オプション パラメータ

  • redirect_uri - コールバック URI 全体(一部ではなく)が登録済みのクライアント アプリで指定されている場合、このパラメータは任意です。コールバック URI 全体が指定されていない場合は必須です。コールバックは、作成した認証コードを Apigee が送信する URL です。アプリの登録と API キーの管理をご覧ください。
  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

認証ヘッダーは必要ありませんが、登録されたクライアント アプリのクライアント ID をリクエストで入力する必要があります。

サンプル ポリシー

これは、基本的な GenerateAuthorizationCode ポリシーです。その他の構成オプションについては、OAuthV2 ポリシーをご覧ください。

<OAuthV2 name="GenerateAuthorizationCode">
    <Operation>GenerateAuthorizationCode</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

戻り値

<GenerateResponse> が有効な場合、このポリシーは認証コードが添付された redirect_uri(コールバック URI)のロケーションに ?code クエリ パラメータを返します。302 ブラウザ リダイレクトを介して、レスポンスの Location ヘッダーの URL とともに送信されます。例: ?code=123456

<GenerateResponse>false に設定されている場合、このポリシーはレスポンスを返しません。代わりに、以下のフロー変数のセットに認証コードに関するデータを入力します。

oauthv2authcode.{policy-name}.code
oauthv2authcode.{policy-name}.scope
oauthv2authcode.{policy-name}.redirect_uri
oauthv2authcode.{policy-name}.client_id

次に例を示します。

oauthv2authcode.GenerateAuthorizationCode.code
oauthv2authcode.GenerateAuthorizationCode.scope
oauthv2authcode.GenerateAuthorizationCode.redirect_uri
oauthv2authcode.GenerateAuthorizationCode.client_id

アクセス トークンをリフレッシュする

リフレッシュ トークンとは、一般にアクセス トークンの有効期限が切れたり無効になったりした後で、アクセス トークンを取得するために使用する認証情報です。アクセス トークンを受け取ったときレスポンスでリフレッシュ トークンが返されます。

リクエストの例

次の呼び出しで Basic 認証ヘッダーをエンコードする方法については、Basic 認証の認証情報をエンコードするをご覧ください。

$ curl -X POST \
  -H "Content-type: application/x-www-form-urlencoded" \
  -H "Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ" \
  https://apitest.acme.com/oauth/refresh \
  -d "grant_type=refresh_token&refresh_token=yVSL38WpuN3Kzn1UTMoE6AQ4ANZM"

必須パラメータ

デフォルトでは、上記の例で示すように、ポリシーはリクエスト本文で指定された x-www-form-urlencoded パラメータとしてこれらを検索します。これらの入力用の別のロケーションを構成するには、OAuthV2 ポリシーで <GrantType> 要素と <RefreshToken> 要素を使用します。詳しくは、OAuthV2 ポリシーをご覧ください。

  • grant_type - 値を refresh_token に設定する必要があります。
  • refresh_token - 更新するアクセス トークンに関連付けられたリフレッシュ トークン。

オプション パラメータ

  • state - レスポンスとともに返される文字列。通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために使用されます。
  • scope - 作成されたトークンを使用できる API プロダクトのリストをフィルタリングできます。スコープの詳細については、OAuth2 スコープの操作をご覧ください。

承認

認証ヘッダーは必要ありませんが、登録されたクライアント アプリのクライアント ID をリクエストで入力する必要があります。

アクセス トークンを更新するとき、ユーザーの再認証はありません。

ここでは、リフレッシュ トークンを使用してアクセス トークンを生成するためのエンドポイント構成のサンプルを示します。これにより RefreshAccessToken ポリシーが実行されます。

 ...
       <Flow name="generate-refresh-token">
            <Request>
                <Step>
                    <Name>RefreshAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/refresh") and (request.verb = "POST")</Condition>
       </Flow>
...

サンプル ポリシー

これは、refresh_token 権限付与タイプを受け入れるように構成された基本的な RefreshAccessToken ポリシーです。このポリシーを使用して構成できる任意の構成要素については、OAuthV2 ポリシーをご覧ください。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="RefreshAccessToken">
    <Operation>RefreshAccessToken</Operation>
    <GenerateResponse enabled="true"/>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
</OAuthV2>

戻り値

<GenerateResponse> を有効にすると、ポリシーは新しいアクセス トークンを含む JSON レスポンスを返します。refresh_token 権限付与タイプでは、アクセス トークンと新しいリフレッシュ トークンの両方を作成できます。次に例を示します。

{
    "issued_at": "1420301470489",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "refresh_token_issued_at": "1420301470489",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "token_type": "BearerToken",
    "refresh_token": "8fKDHLryAD9KFBsrpixlq3qPJnG2fdZ5",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "jmZ2Hqv3iNsABUtAAsfWR3QGNctw",
    "organization_name": "docs",
    "refresh_token_expires_in": "28799", //--in seconds
    "refresh_count": "2"
}

新しいリフレッシュ トークンが作成されると、元のトークンは有効でなくなります。

上記のレスポンスは、<GenerateResponse> が true に設定されている場合に返されます。<GenerateResponse> が false に設定されている場合、ポリシーはレスポンスを返しません。代わりに、以下のコンテキスト(フロー)変数のセットに、アクセス トークン付与に関するデータを入力します。

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

次に例を示します。

oauthv2accesstoken.RefreshAccessToken.access_token
oauthv2accesstoken.RefreshAccessToken.expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token
oauthv2accesstoken.RefreshAccessToken.refresh_token_expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token_issued_at
oauthv2accesstoken.RefreshAccessToken.refresh_token_status

Basic 認証情報をエンコードする

トークンまたは認証コードをリクエストするための API 呼び出しを行う場合、OAuth 2.0 仕様では、client_id と client_secret の値を HTTP-Basic 認証ヘッダーとして渡すことをおすすめします(IETF RFC 2617 を参照)。これを行うには、2 つの値を結合してコロンで区切った結果を Base64 エンコードする必要があります。

擬似コードでは次のようになります。

result = Base64Encode(concat('ns4fQc14Zg4hKFCNaSzArVuwszX95X', ':', 'ZIjFyTsNgQNyxI'))

ns4fQc14Zg4hKFCNaSzArVuwszX95X は client_id、ZIjFyTsNgQNyxI はクライアント シークレットです。

次のサンプル コマンドは、Linux と MacOS で機能します。

export CREDENTIALS=$(echo -n 'ns4fQc14Zg4hKFCNaSzArVuwszX95X:ZIjFyTsNgQNyxI' | base64)

次に、トークン リクエストを以下のように行います。

$ curl -i -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: Basic $CREDENTIALS" \
  -X POST "https://apitest.acme.com/oauth/token" \
  -d "grant_type=client_credentials"

データベース内でトークンをハッシュする

Apigee は、データベースのセキュリティ侵害が発生した場合に、すべての OAuth アクセス トークンとリフレッシュ トークンをハッシュして保護します。API 呼び出しでハッシュなしのトークンを使用すると、Apigee はデータベース内のハッシュされたバージョンに対してトークンを検証します。

関連トピック