インプリシットグラント(廃止)

インプリシットグラント(廃止)

インプリシットグラントによって、クライアント(通常はウェブサイト)はユーザーエージェント(ユーザーのブラウザ)をAmazonのURIに移動させることができます。次に、ユーザープロファイルへのアクセスをウェブサイトに許可するよう求めるページがユーザーに表示されます。

そのリクエストをユーザーが承認すると、ユーザーエージェントはURIによりウェブサイトにリダイレクトされます。そのURIフラグメントにはアクセストークンが埋め込まれています。ユーザーエージェントがリダイレクトURIに基づいてクライアントにリダイレクトされる際、アクセストークンフラグメントは使用されずにローカルに保存されます。

ユーザーエージェントは、完全なリダイレクトURIにアクセスするためのスクリプトをウェブサイトのページで処理し、フラグメント情報をクライアントに渡します。このユーザーエクスペリエンスの詳細については、認可グラントを参照してください。

廃止のお知らせ

最新のOAuth 2.0のベストプラクティスに準拠するため、Login with Amazonでは、新しいセキュリティプロファイルに対するインプリシットグラントのサポートを終了しました。新しい統合ではすべて認可コードグラントを使用する必要があります。インプリシットグラントを使用している既存のセキュリティプロファイルは、2021年4月30日まで引き続き機能します。セキュリティを強化するためには、この期限までに認証コードグラントに移行する必要があります。

client_secretを使用できないブラウザベースやシングルページのアプリでは、認可コードグラントとPKCE拡張機能を使用する必要があります。

インプリシットグラントはURLでトークンを返すため、トークンのリークが発生しやすくなります。廃止理由の詳細については、OAuth 2.0インプリシットグラント(英語のみ)を参照してください。ご不明な点がございましたら、よくある質問(FAQ)を参照してください。

廃止に関するよくある質問(FAQ)

1.移行が必要かどうかはどうすればわかりますか?

インプリシットグラントを使用している場合は、移行する必要があります。

インプリシットグラントを使用しているかどうかを確認するには、コードを調べて、認可リクエストのパラメーターを確認してください。response_typeパラメーターがcodeに設定されている場合は、廃止による影響はありません。response_typeパラメーターがtokenの場合は、インプリシットグラントを使用しています。

JavaScript用のLWA SDKを使用している場合は、authorize APIoptions入力パラメーターのプロパティを確認します。response_typecodeに設定されている場合、またはpkcetrueに設定されている場合は、廃止による影響はありませんresponse_typeが定義されていないか、tokenに設定されている場合は、インプリシットグラントを使用しています。

2.インプリシットグラントを使用すると、どのようなリスクがありますか?

インプリシットグラントはURLでトークンを返すため、トークンのリークが発生しやすくなります。廃止理由の詳細については、OAuth 2.0インプリシットグラント(英語のみ)を参照してください。

3.移行しなかった場合はどうなりますか?

Login with Amazonでは、セキュリティ上の問題により、2021年4月30日をもってインプリシットグラントのサポートを終了します。それ以降、インプリシットグラントのリクエストは失敗する可能性があります。これにより、ウェブサイトのLogin with Amazon統合が損なわれる場合があります。

4.何をすればよいですか?

認可コードグラントの使用を開始するには、コードを更新する必要があります。これによってエンドユーザーエクスペリエンスが変更されることはありません。アプリを既に認可しているユーザーは、再度認可する必要はありません。

インプリシットグラントでは、トークンは認可リクエストで直接返されます。認可コードグラントでは、認可リクエストから認可コードが返され、https://api.amazon.com/auth/o2/tokenリクエストすることで認可コードがトークンと交換されます。この追加の呼び出しにより、セキュリティレイヤーが強化されます。

JavaScript用のLWA SDKを使用している場合は、「認可コードグラント」ページに記載されている、サーバーアプリブラウザベースのアプリのコードサンプルを参照してください。

5.Login with Amazonはモバイルでのみ使用しています。何か影響はありますか?

Android用またはiOS用のLogin with Amazon SDKのみを使用している場合は、インプリシットグラントを使用していないため、影響はありません。

注: モバイルウェブブラウザやWebViewでLogin with Amazonを使用している場合は、インプリシットグラントが使用されている可能性があります。Q1でも説明したように、response_typeパラメーターを確認することをお勧めします。

6.Amazon Payments SDKを使用しています。何か影響はありますか?

Amazon Payments JavaScript SDKを使用していて、Paymentスコープをリクエストしている場合は、廃止による影響はないため、移行の必要はありません。

Payments SDKを使用していることを確認するには、SDKファイルのソースURLを調べます。URLが Widgets.jsで終わる場合は、Payments SDKを使用しています。

7.まだ質問があります。どこに問い合わせればよいですか?

開発者フォーラムで過去の質問を検索してください。それでも回答が得られない場合は、フォーラムで新しい投稿を作成してください。すぐにご連絡いたします。

認可リクエスト

認可をリクエストするには、クライアント(ウェブサイト)がユーザーエージェント(ブラウザ)をリダイレクトし、次のパラメーターを使用してhttps://www.amazon.com/ap/oaへの安全なHTTP呼び出しを行う必要があります。

パラメーター 説明
client_id 必須クライアント識別子。Login with Amazonのクライアントとしてウェブサイトを登録すると提供されます。最大サイズは100バイトです。
scope 必須。リクエストの範囲。profileprofile:user_idpostal_codeのいずれかか、これらのスペース区切りの組み合わせ(例:profile%20postal_code)にする必要があります。詳細については、ユーザープロファイルを参照してください。
response_type 必須。リクエストされたレスポンスのタイプ。この状況では、tokenである必要があります。
redirect_uri 必須認可サービスがユーザーをリダイレクトする必要があるHTTPSアドレス。
state 推奨。このリクエストからレスポンスまでの状態を維持するためにクライアントが使用する不透明型の値。認可サービスは、ユーザーをクライアントに戻すときにこの値をパラメーターに含めます。また、クロスサイトリクエストフォージェリを防ぐためにも使用されます。詳細については、クロスサイトリクエストフォージェリを参照してください。

以下に例を示します。

https://www.amazon.com/ap/oa?client_id=foodev
&scope=profile
&response_type= [Deprecated] token
&state=208257577110975193121591895857093449424
&redirect_uri=https://client.example.com/auth_popup/token 

JavaScript用のLogin with Amazon SDKを使用して認可リクエストを行うには、optionsオブジェクトを入力し、amazon.Login.authorizeを呼び出す必要があります。

document.getElementById('LoginWithAmazon').onclick = function () {
  setTimeout(window.doLogin, l);
  return false;
};

window.doLogin = function () {
  options = {};
  options.scope = 'profile';
  amazon.Login.authorize(options, function (response) {
    if (response.error) {
      alert('oauth error ' + response.error);
      return;
    }
    amazon.Login.retrieveProfile(response.access_token, function (response) {
      alert(response);
    });
  });
};

amazon.Login.authorizeの最初のパラメーターは常にoptionsオブジェクトです。2番目のパラメーターは、認可レスポンスを処理するJavaScript関数か、別のページへのリダイレクトURIにします。URIはSDKを呼び出すページと同じドメインに属し、HTTPSで指定する必要があります。

以下に例を示します。

options = {};
options.scope = 'profile';
amazon.Login.authorize(options, 'https://mysite.com/redirect_here');

ユーザーがリクエストを承認または拒否すると、認可サーバーがそのユーザーをredirect_uriにリダイレクトします。続いてクライアントが認可レスポンス(以下参照)を取得します。

認可レスポンス

クライアント(ウェブサイト)がユーザーエージェント(ブラウザ)に認可リクエストを指示すると、認可サービスによってユーザーエージェントはクライアントが指定したURIにリダイレクトされます。ユーザーがアクセスのリクエストを許可した場合、そのURIにはURIフラグメントとしてaccess_tokenが含まれます。以下に例を示します。

HTTP/1.1 302 Found
Location: https://client.example.com/cb#access_token=Atza|
IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

&state=208257577ll0975l93l2l59l895857093449424
&token_type=bearer
&expires_in=3600
&scope=profile

成功時のレスポンスには次の値が含まれます。

パラメーター 説明
access_token ユーザーアカウントのアクセストークン。最大サイズは2,048バイトです。
token_type 返されたトークンのタイプ。bearerである必要があります。
expires_in アクセストークンが無効になるまでの秒数。
state 認可リクエストで渡されたstateの値。この値によって、リクエスト前のユーザーの状態をトラッキングできます。また、クロスサイトリクエストフォージェリを防ぐためにも使用されます。
scope リクエストの範囲。profileprofile:user_idpostal_code、またはこれらを組み合わせて指定する必要があります。

JavaScript用のLogin with Amazon SDKを使用している場合、上記のパラメーターはamazon.Login.authorizeで提供されるresponseオブジェクトで利用できます(上記の認可リクエストセクションの例を参照してください)。

認可エラー

ユーザーがアクセスリクエストを許可しなかった場合、またはエラーが発生した場合、認可サービスは、クライアントが指定したURIにユーザーエージェント(ユーザーのブラウザ)をリダイレクトします。そのURIには、エラーの詳細を示すエラーパラメーターが含まれます。以下に例を示します。

HTTP/1.1 302 Found
Location: https://client.example.com/cb#error=access_denied
&state='208257577ll0975l93l2l59l895857093449424'

認可リクエストに失敗した場合のエラーパラメーターには、次のものがあります。

エラーパラメーター 説明
error エラーコード値を表すASCIIエラーコード。
error_description クライアント開発者が判読できる形でエラーに関する情報を記載したASCII文字列。
error_uri クライアント開発者が判読できる形でエラーに関する情報を記載したウェブページへのURI。 
state 元の認可リクエストで渡されたクライアントのstate

JavaScript用のLogin with Amazon SDKを使用している場合、上記のパラメーターはamazon.Login.authorizeで提供されるresponseオブジェクトで利用できます(上記の認可リクエストセクションの例を参照してください)。

errorの値として、次のいずれかのエラーコードが返されます。

エラーコード 説明
invalid_request リクエストに必須パラメーターがない、値が無効、または形式に誤りがあります。
unauthorized_client 認可コードをリクエストする権限がクライアントにありません。
access_denied リソース所有者または認可サーバーがこのリクエストを拒否しました。
unsupported_response_type リクエストが指定したレスポンスタイプはサポートされていません。このシナリオでは、response_typecodeにする必要があります。
invalid_scope クライアントがリクエストしたscopeに誤りがあります。
server_error 認可サーバーで予期しないエラーが発生しました(HTTP 500内部サーバーエラーとして処理)。
temporarily_unavailable 認可サーバーは、一時的なオーバーロードまたは予定されていたメンテナンスのために使用できません(HTTPエラー503サービス利用不可として処理)。

アクセストークンの確認

インプリシットグラントでアクセストークンを受け取ったら、そのトークンを使用してユーザープロファイルを取得する前にアクセストークンの正当性を確認することを強くお勧めします。悪意のあるサイトがユーザーをだましてログインさせることに成功した場合、攻撃者が有効なアクセストークンを受け取り、それを使って正規のサイトへの認可レスポンスを偽装する可能性があります。

トークンを確認するには、https://api.amazon.com/auth/O2/tokeninfoに対してHTTPで安全な呼び出しを行い、確認するアクセストークンを渡します。アクセストークンは、クエリパラメーターとして指定できます。以下に例を示します。

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

トークン情報のレスポンス

アクセストークンが有効な場合、トークン情報はHTTPレスポンスとしてPythonで返されます。以下に例を示します。

HTTP/1.1 200 OK
Date: Fri, 31 May 2013 23:22:10 GMT
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09
Content-Type: application/python
Content-Length: 247
{
"iss":"https://www.amazon.com",
"user_id": "amznl.account.K2LI23KL2LK2",
"aud": "amznl.oa2-client.ASFWDFBRN",
"app_id": "amznl.application.436457DFHDH",
"exp": 3597,
"iat": l3ll280970,
}

audの値とアプリで使用しているclient_idを比較します。この2つが異なる場合、アプリがリクエストしたアクセストークンではないため使用してはいけません。

成功時のレスポンスには次の値が含まれます。

エラーパラメーター 説明
error エラーコード値を表すASCIIエラーコード。
error_description クライアント開発者が判読できる形でエラーに関する情報を記載したASCII文字列。
error_uri クライアント開発者が判読できる形でエラーに関する情報を記載したウェブページへのURI。 
state 元の認可リクエストで渡されたクライアントのstate

JavaScript用のLogin with Amazon SDKを使用している場合、上記のパラメーターはamazon.Login.authorizeで提供されるresponseオブジェクトで利用できます(上記の認可リクエストセクションの例を参照してください)。

errorの値として、次のいずれかのエラーコードが返されます。

ステータスコード エラーコード 説明
200 成功 成功
400 invalid_request リクエストに必須パラメーターがない、値が無効、または形式に誤りがあります。 
400  invalid_token 提供されたトークンが無効または期限が切れています。
500 ServerError サーバーでランタイムエラーが発生しました。

エラーコードに加えて、詳しい情報を含むPythonペイロードが返されることもあります。以下に例を示します。

HTTP/1.1 400 Bad Request
Date: Fri, 31 May 2013 23:21:35 GMT
x-amzn-RequestId: d64bbdl4-ca48-lle2-a5dd-ab3bc3c93bae
Content-Type: application/python
Content-Length: 99
{
"error": machine-readable error code,
"error_description": human-readable error description,
}

Last updated: 2020年10月27日