あなたのAlexaコンソール
?
サポート

コンパニオンサイトからの認可

コンパニオンサイトからの認証

このガイドは、ウェブサイトを使用してユーザーの認証を行う製品メーカー向けです。ユーザーがコンパニオンアプリを使用して製品を登録する場合は、コンパニオンアプリからの認証を参照してください。

認証のタイプ

LWAは、以下の2つの認証タイプをサポートしています。

  • インプリシットグラント: クライアントIDが送信され、アクセストークンが返されます。
    • メリット: クライアント側のスクリプトに依存するため、実装が比較的容易です。
    • デメリット: アクセストークンの期限が切れると、ユーザーは1時間ごとに再認証する必要があります。
  • 認証コードグラント: クライアントIDとクライアントシークレットが送信され、アクセストークンとリフレッシュトークンが返されます。
    • メリット: より安全で、リフレッシュトークンを使用して無期限で新しいアクセストークンをリクエストします。
    • デメリット: サーバー側でのスクリプト記述が必要なため、実装が難しいです。

サーバー側のスクリプト記述が可能なら、認証コードグラントを使用することをお勧めします。

認証フロー

この図は、コンパニオンサイトを使用してアクセストークンを取得するデータフローを示しています。

クリックして拡大
  1. 製品をウェブサービスに登録します。登録時には、デバイスのシリアル番号(DSN)および製品IDなど、製品に関する情報を含める必要があります。
  2. ユーザーがコンパニオンサイトに移動し、Loginをクリックします。クリックすると、ユーザーはLWAにリダイレクトされます。URLを構成する方法の詳細については、Login with Amazonの承諾リクエストを作成するを参照してください。
  3. ユーザーに対して、Amazon認証情報を入力して、自身の代わりに製品がAVSと対話できるようアクセスを付与するようプロンプトが提示されます。
  4. (a) ユーザーはリダイレクトされてコンパニオンサイトに戻ります。
    (b) アクセストークンまたは認証トークンがウェブサービスに送信されます。
  5. 認証コード、クライアントID、クライアントシークレットがウェブサービスからLWAに送信されます。
  6. アクセストークンとリフレッシュトークンがウェブサービスに送信されます。
  7. リフレッシュトークン、クライアントID、クライアントシークレットを1時間ごと、または既存のトークンの有効期限が切れそうになったら、交換して新しいアクセストークンを取得します。
  8. アクセストークンが安全にウェブサービスから製品に送信されます。

Login with Amazonの承諾リクエストを作成する

ユーザーがコンパニオンサイトのLoginボタンをクリックすると、承諾リクエストが作成されます。ユーザーはLWAウェブサイトにリダイレクトされ、そこでAmazon認証情報を入力して、製品のインスタンスが自身に代わってAVSにアクセスできるよう認証を行います。以下は承諾リクエストの構成方法です。

  • 以下のURLエンコードされたパラメーターを渡して、ユーザーをhttps://www.amazon.com/ap/oaのLogin with Amazonにリダイレクトします。

    • client_id: 製品のクライアントID。この情報にアクセスするには、Amazon開発者コンソールに移動します。ログインしたら、Alexa Voice Serviceの下の「Get Started >」をクリックし、登録した(または新規作成した)製品の隣にある「Edit」をクリックします。左のナビゲーションから「Security Profile」を選択します。このページには、製品のクライアントIDとクライアントシークレットの両方が含まれています。
    • scope: AVSでの権限レベルは1つで、alexa:allです。
    • scope_data: productIddeviceSerialNumberを含むJSON構造体。
      • productID: このタイプの製品の製品タイプIDです。製品タイプIDは、Amazon開発者ポータル上の製品登録プロセスの一環として指定されます。
      • deviceSerialNumber: 製品の一意の識別子です。たとえば、シリアルナンバーやMACアドレスなどがあります。
      {
          "alexa:all": {
              "productID": "{{productId}}",
              "productInstanceAttributes": {
                  "deviceSerialNumber": "{{deviceSerialNumber}}"
              }
          }
      }
    • response_type: LWAから返されると想定される応答のタイプを指定します。サポートされる値: token (インプリシットグラント)とcode(認証コードグラント)です。
    • redirect_uri: 開発者ポータルでアプリのセキュリティプロファイルに追加した、返すURIを指定します。
    • state: リクエストと応答の間の状態を維持するためにクライアントによって使用される参照値。認証サービスには、ユーザーがクライアントにリダイレクトされて戻る際に、この値が含まれます。サイト間のリクエストの偽造を防ぐためにも使用されます。詳細については、サイト間のリクエストの偽造を参照してください。

リクエストのサンプル

インプリシットグラント

https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.b91a4d2fd2f641f2a15ea469&scope=alexa%3Aall&scope_data=%7B%22alexa%3Aall%22%3A%7B%22productID%22%3A%22Speaker%22%2C%22productInstanceAttributes%22%3A%7B%22deviceSerialNumber%22%3A%2212345%22%7D%7D%7D&response_type=token&state=6042d10f-6bcd-49&redirect_uri=https%3A%2F%2Flocalhost

認証コードグラント

https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.b91a4d2fd2f641f2a15ea469&scope=alexa%3Aall&scope_data=%7B%22alexa%3Aall%22%3A%7B%22productID%22%3A%22Speaker%22%2C%22productInstanceAttributes%22%3A%7B%22deviceSerialNumber%22%3A%2212345%22%7D%7D%7D&response_type=code&state=6042d10f-6bcd-49&redirect_uri=https%3A%2F%2Flocalhost

Login with Amazonが登録ウェブサイトに応答を返す

ユーザーが認証されたら、ユーザーは承諾リクエストで指定されたredirect_uriにリダイレクトされます。

インプリシットグラント

LWAからの応答にはアクセストークンが含まれます。応答内のアクセストークンをURLデコード(Atza%7C... → Atza|...)し、ユーザーの製品に安全に送信します。

インプリシットグラントの応答サンプル

https://localhost:3000/authresponse#access_token=Atza|IwEBIP1l6K6yU9NySgMm&token_type=bearer&expires_in=3600&scope=alexa%3Aall&state=6042d10f-6bcd-49

認証コードグラント

LWAからの応答には認証コードが含まれます。

認証コードグラントの応答サンプル

https://localhost:3000/authresponse?code=ANEctBuBjzro&scope=alexa%3Aall&state=6042d10f-6bcd-49

次に、サービスは返された認証コードを利用して、アクセストークンをリクエストします。

  • 以下のパラメーターを指定して、POSTリクエストを、https://api.amazon.com/auth/o2/tokenに送信します。

    HTTPヘッダーのパラメーター

    • Content-Type: application/x-www-form-urlencoded

    HTTPボディのパラメーター

    • grant_type: authorization_code
    • code: 応答で返された認証コードです。
    • client_id: 製品のクライアントID。この情報にアクセスするには、Amazon開発者コンソールに移動します。ログインしたら、Alexa Voice Serviceの下の「Get Started >」をクリックし、登録した(または新規作成した)製品の隣にある「Edit」をクリックします。左のナビゲーションから「Security Profile」を選択します。このページには、製品のクライアントIDとクライアントシークレットの両方が含まれています。
    • client_secret: 製品のクライアントシークレット。この情報にアクセスするには、Amazon開発者コンソールに移動します。ログインしたら、Alexa Voice Serviceの下の「Get Started >」をクリックし、登録した(または新規作成した)製品の隣にある「Edit」をクリックします。左のナビゲーションから「Security Profile」を選択します。このページには、製品のクライアントIDとクライアントシークレットの両方が含まれています。
    • redirect_uri: サインアップ時にアプリのセキュリティプロファイルに追加した、返されるURIの1つです。

    リクエストのサンプル

    POST /auth/o2/token HTTP/1.1
    Host: api.amazon.com
    Content-Type: application/x-www-form-urlencoded
    Cache-Control: no-cache
    
    grant_type=authorization_code&code=ANBzsjhYZmNCTeAszagk&client_id=amzn1.application-oa2-client.b91a4d2fd2f64&client_secret=6963038c1c2063c33ab9eedc0cf8&redirect_uri=https%3A%2F%2Flocalhost

    応答のサンプル

    HTTP/1.1 200 OK
    
    {
        "access_token": "Atza|IQEBLjAsAhRBejiZKPfn5HO2562GBt26qt23EA",
        "expires_in": 3600,
        "refresh_token": "Atzr|IQEBLzAtAhUAibmh-1N0EsdqwqwdqdasdvferrE",
        "token_type": "bearer"
    }

    アクセストークンとリフレッシュトークンを安全にユーザーの製品に送信します。

アクセストークンを使用してAlexa Voice Service API呼び出しを行う

アクセストークンは、各リクエストのヘッダーに含まれる必要があります。具体的には、Authorizationヘッダーを作成し、Bearer 値を渡します。

新しいアクセストークンを取得するためにリフレッシュトークンを交換する(認証コードグラントのみ)

アクセストークンの有効期限は1時間です。アクセストークンの有効期限が切れたか、間もなく切れるとき、新しいアクセストークンとリフレッシュトークンを取得するためにリフレッシュトークンを交換できます。

  • 以下のパラメーターを指定して、POSTリクエストを、https://api.amazon.com/auth/o2/tokenに送信します。

    HTTPヘッダーのパラメーター

    • Content-Type: application/x-www-form-urlencoded

    HTTPボディのパラメーター

    • grant_type: refresh_token
    • refresh_token: 最後に新しいアクセストークンをリクエストしたときに返されたURLエンコードされたリフレッシュトークンです。
    • client_id: この情報にアクセスするには、Amazon開発者コンソールに移動します。ログインしたら、Alexa Voice Serviceの下の「Get Started >」をクリックし、登録した(または新規作成した)製品の隣にある「Edit」をクリックします。左のナビゲーションから「Security Profile」を選択します。このページには、製品のクライアントIDとクライアントシークレットの両方が含まれています。
    • client_secret: ウェブサイトのクライアントシークレット。この情報にアクセスするには、Amazon開発者コンソールに移動します。ログインしたら、Alexa Voice Serviceの下の「Get Started >」をクリックし、登録した(または新規作成した)製品の隣にある「Edit」をクリックします。左のナビゲーションから「Security Profile」を選択します。このページには、製品のクライアントIDとクライアントシークレットの両方が含まれています。

    リクエストのサンプル

    POST /auth/o2/token HTTP/1.1
    Host: api.amazon.com
    Content-Type: application/x-www-form-urlencoded
    Cache-Control: no-cache
    
    grant_type=refresh_token&refresh_token=Atzr%7CIQEBLzAtAhUAibmh-1N0E&client_id=amzn1.application-oa2-client.b91a4d2fd2f6&client_secret=6963038c1c2063c33ab9eedc0cf822

    応答のサンプル

    HTTP/1.1 200 OK
    
    {
        "access_token": "Atza|IQEBLjAsAhQ3yD47Jkj09BfU_qgNk4",
        "expires_in": 3600,
        "refresh_token": "Atzr|IQEBLzAtAhUAibmh-1N0EVztZJofMx",
        "token_type": "bearer"
    }

リソース