リダイレクト認証エクスペリエンスの利用
いくつかケースとして、購入者がモバイルデバイスを利用している場合は、同じページ内で、購入者のAmazon認証するためにリダイレクトしたいかもしれません。
このセクションでは次の情報を説明します。
- 処理方法 Webサイトでリダイレクト認証を可能にするために必要な変更内容です。
- クロスサイトリクエストフォージェリ 購入者のWebブラウザを利用した攻撃から守る方法です。
- 購入者が拒否した場合 認証中に購入者がAmazon Payの個人情報をにアクセスする承諾を拒否した場合のハンドリング方法です。
処理方法
次のステップは、Webサイトでリダイレクト認証するために必要な変更内容を説明します。
- ボタンウィジェット内のpopupパラメータにfalseをセットします。
- Webページ上からaccess tokenを受け取るために<head>セクション内にJavaScriptコードを要求されたウィジェット内に追加しなければなりません。
次のサンプルコードは、access tokenを受け取るためのJavaScriptを表します。
<script type='text/javascript'> function getURLParameter(name, source) { return decodeURIComponent((new RegExp('[?|&|#]' + name + '=' + '([^&]+?)(&|#|;|$)').exec(source) || [,""])[1].replace(/\+/g, '%20')) || null; } var accessToken = getURLParameter("access_token", location.hash); if (typeof accessToken === 'string' && accessToken.match(/^Atza/)) { document.cookie = "amazon_Login_accessToken=" + accessToken + ";secure"; } window.onAmazonLoginReady = function () { amazon.Login.setClientId('amzn1.application-oa2- client.d607ddd4957c44019e73086bc7cSAMPLE'); amazon.Login.setUseCookie(true); }; </script> <script src='https://static-fe.payments-amazon.com/OffAmazonPayments/jp/ sandbox/lpa/js/Widgets.js?sellerId=YOUR_SELLER_ID'> </script>
- ウィジェットのcookieを削除します。AmazonログインSDK for JavaScriptを利用している場合は、多くのキャッシュされているトークンを削除するためにamazon.Login.logoutメソッドを呼び出すことができます。リダイレクト認証を利用している場合は、アドレス帳ウィジェットとお支払い方法ウィジェットで利用されるcookieを削除するべきです。続いて呼び出すamazon.Login.authorizeはデフォルトでログイン画面を表示します。
次のサンプルコードは、キャッシュされたトークンを削除するために、AmazonログインSDK for JavaScriptのamazon.Login.logoutメソッドを利用します。<script type="text/javascript"> document.getElementById('Logout').onclick = function() { amazon.Login.logout(); document.cookie = "amazon_Login_accessToken=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; window.location = 'REDIRECT_URL'; }; </script>
クロスサイトリクエストフォージェリ
攻撃者が悪意のあるサイトへユーザーを誘導し認証リンクをクリックするように騙す場合に、クロスサイトリクエストフォージェリが起こります。
多くのコマンドが埋め込まれた悪意のあるリンクは自動的に実行されます、なぜなら、ユーザーは既にサイトで認証されているからです。よって、ユーザーはログイン画面や多くの悪意のある挙動の確証を見ません。Amazonログインのケースでは、クロスサイトリクエストフォージェリがクライアントや認証サーバを真似て利用することができます。
Amazonログインでクライアントを登録する場合は、クライアントはクライアントID(client_id)とクライアントシークレット(client_secret)が割与えられます。クライアントの認証確認はアクセストークンリクエスト内のclient_idとclient_secretパラメータを利用します。(これらの値は攻撃者によって偽造されなければなりません)
Amazonログインはクロスサイトリクエストフォージェリが起こらないようにするためにステートパラメータを利用します。クライアントは認証リクエストを始める時にステートパラメータの値をセットします。client_idとclient_secretの値が異なっていれば、ステートの値はそれぞれの認証要求で異なっているべきです。認証サーバは認証コードとアクセストークンをクライアントとの通信に渡すために同じ値を返します。ステートパラメータが最初の呼び出しからの値と一致しない場合は、通信は無視されるべきです。
ステートパラメータの計算
クライアントは選択した任意の方法でステートの値を計算することができます。しかしながら、値が偽造ではなくセキュアであることを保証しなければなりません。Amazonログインはステートを計算するためにHash-based Message Authentication(HMAC)を使うことを推奨します。HMAC方法はRFC2104に詳しく述べられています。詳しい情報はRFC2104を参照してください。
ステートの値を計算するためにこの方法を利用します。クライアントのみが知っているcsrf_secretとauthenticatorメッセージを持たなければなりません。
このステートの値はHMAC(csrf_secret, authenticator)で計算されます。それからauthenticatorの値はクライアントによって保存されます。
ステートが認証レスポンスによって返答された場合は、回収したauthenticatorの値と再度HMAC(csrf_secret, authenticator)計算を実行することによってステートを確認することができます。値が一致しなかった場合は、認証レスポンスを無視しなければなりません。
購入者が拒否した場合
初めてWebサイトで購入者がログインし認証されると、購入者はAmazon Payの個人情報を共有するための同意を与えなければなりません。リダイレクト認証中に、購入者が同意画面でキャンセルボタンをクリックし同意を拒否した場合は、Amazon Payは購入者をリダイレクトURLに進めますが、AcceeTokenの差し戻す代わりに、エラー情報を返します。
エラー情報がクエリー文字列経由で返された場合は、Access TokenはURLフラグメント内で返されることに注意してください。リダイレクトURLをレンダリングする前に、エラー情報がクエリー文字列に含まれるか確認が必要であり、見つかった場合は、ログイン処理が初期化されたページにリダイレクトします。
次のサンプルはAmazon Pay個人情報を共有するための同意を与えるURLフラグメントを表します。
https://www.sample-store.com/amazonReturn.html#access_token=Atza%7CIQEBLjAsAhQWkVKdr_uRdbW7QpkRY8LIxgQIUczBscZcklUALuEd651Nd1_ulkU8WiXq7ZmzcAlp9lZ6Vf_pwaAGL1eVBVKx2x74TmQJkdZiaMdVOT99M34V3HvWOtPgWOxUqIgcgBoJ4R1LenaOIg9ZMyU_YO0Ma4Xvsqg7R5fTozyZaVVv5PwGNRhrQq32RFU7x4Jr6riKsR1AWFoSW3i1arpDCmbF_P3CgVf5X7Y3Dmdkci7JTestAccessToken&token_type=bearer&expires_in=3600&scope=profile+payments%3Awidget
次のサンプルは、購入者が個人情報の共有を拒否した場合でのクエリー文字列内で返されるエラー情報です。
https://www.sample-store.com/amazonReturn.html?error_description=Access+not+permitted.&error=access_denied