リダイレクト認証を有効にする。

購入者がモバイルデバイスを利用しているなどのいくつかのケースでは、ポップアップウィンドウを表示するよりも、同じウィンドウ内でAmazon認証ページへ購入者をリダイレクトするのがベストプラクティスです。

処理内容

次の内容では、Webサイトでリダイレクト認証を有効にする方法を説明します。

  1. ボタンウィジェット内のポップアップパラメータをfalseにセットします。
  2. Webページ上で購入者をリダイレクトしたい場合は、ウィジェットで利用するために必要なアクセストークンを受け取るために、<head>セクションにJavaScriptコードを追加しなければなりません。詳しい情報はアクセストークンを参照してください。
    次のサンプルコードは、アクセストークンを受け取る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 +  
          ";path=/;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>
    
  3. ウィジェットのCookieを削除します。AmazonログインJavaScript SDKを利用している場合は、キャッシュされたトークンを削除するためにamazon.Login.logoutメソッドを呼び出すことができます。リダイレクト認証を利用している場合は、 アドレス帳お支払い方法 ウィジェットで利用されたCookieも削除する必要があります。デフォルトのログイン画面を表示するために、amazon.Login.authorizeの呼び出しを確実にします。次のサンプルコードは、AmazonログインJavaScript SDKの 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ログインのためにクライアントを登録した場合は、クライアント識別子(client_id)とクライアントシークレット(client_secret)が割り与えられます。クライアントは、アクセストークン要求内のclient_idとclient_secretパラメータを利用してその識別子を確認します。(これらの値は、攻撃者によって偽装されなければなりません)

Amazonログインは、クロスサイトリクエストフォージェリを防ぐためにStateパラメータも利用します。クライアントは、認証要求を初期化する場合に、Stateパラメータの値をセットします。client_idとclient_secretが同じでない場合は、Stateの値はそれぞれの認証要求で異なります。認証コードとアクセストークンを利用してクライアントが通信している場合は、認証サーバは同じ値を返します。最初の呼び出しからStateパラメータの値が一致しない場合は、通信は無視するべきです。

購入者が同意しない場合

Webサイト上で購入者がログインし認証される最初の場面では、Amazon Payプロファイル情報をサイトと共有するための同意を得なければなりません。リダイレクト認証中の場合は、購入者は同意画面でキャンセルボタンをクリックし同意しません。Amazon Payは購入者をリダイレクトURLに遷移させ、アクセストークンを返す代わりにエラー情報を返します。

アクセスは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