インプリシットグラント(廃止)
インプリシットグラントによって、クライアント(通常はウェブサイト)はユーザーエージェント(ユーザーのブラウザ)を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 APIのoptions
入力パラメーターのプロパティを確認します。response_type
がcode
に設定されている場合、またはpkce
がtrueに設定されている場合は、廃止による影響はありません
。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 |
必須。リクエストの範囲。profile 、profile:user_id 、postal_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 |
リクエストの範囲。profile 、profile:user_id 、postal_code 、またはこれらを組み合わせて指定する必要があります。 |
Location
レスポンスヘッダーフィルドへのフラグメントコンポーネントの埋め込みに対応していないユーザーエージェントもあります。そうしたクライアントはサポートされていません。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_type はcode にする必要があります。 |
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日