インプリシットグラント


インプリシットグラント

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

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

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

認可リクエスト

認可をリクエストするには、クライアント(ウェブサイト)がユーザーエージェント(ブラウザ)をリダイレクトして、次のパラメーターで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=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エラー' + 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/l.l 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/l.l 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 クライアントがリクエストしたスコープに誤りがあります。
server_error 認可サーバーで想定外のエラーが発生しました(HTTP500内部サーバーエラーとして処理)。
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/l.l 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 Success Success
400 invalid_request  リクエストに必須パラメーターがない、値が無効、または形式に誤りがあります。 
400  invalid_token 提供されたトークンが無効または期限が切れています。
500 ServerError サーバーでランタイムエラーが発生しました。

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

HTTP/l.l 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,
}