アカウントリンクは、ユーザーのAmazon IDを、ユーザーが持つ他のシステムのアカウントに接続するしくみです。詳しい情報やユーザーの体験についてはAlexaスキルにおけるユーザーのアカウントリンク体験についてをご覧ください。
このブログでは、アカウントリンクの実装でよく起きる問題とそのトラブルシューティング方法をまとめております。「〇〇のアカウントリンクを完了できませんでした」のエラー、一定期間後にアカウントリンクが無効になる、特定のデバイスでのみアカウントリンクに失敗するなどの事例をご紹介します。
Authorization code grantフローのアカウントリンクで最もよく発生する問題は、認可サーバーのアクセストークンURIからアクセストークンと更新トークンのペアを取得する際に起きます。ユーザーがAlexaアプリからアカウントリンクを開始すると、Alexaはアカウントリンク設定時に登録する認証画面のURIを使用してログインページを表示します。ユーザーが認証されると、認可サーバーが認可コードを生成します。Alexaサービスはこのコードを使用して認可サーバーのアクセストークンURIにPOSTのリクエストを送信し、アクセストークンと更新トークンのペアを取得します。Alexaサービスがアクセストークンと更新トークンのペアを取得できない場合、以下のエラーが表示されます。
トラブルシューティングの方法:
サードパーティの認証サーバー(Google Sign-InやFacebook Loginなど)を使用し、サーバーのログにアクセスできない場合はAWS APIゲートウェイでログにアクセスすることを推奨します。Amazon APIゲートウェイをプロキシとしてAlexaサービスに送信されるJSONを確認する方法はこちら(英語)をご覧ください。
スマートホームスキルの場合、ChangeReportや非同期の応答を送信するためにスキルが「Alexaイベントを送る」を有効にしている可能性があります。
「Alexaイベントを送る」を有効にしている場合、アカウントリンク時にスキルへ送信されるAcceptGrantディレクティブをサポートする必要があります。スキルは同期的応答でAcceptGrant.Responseイベントを使用して応答し、Login with Amazonを呼び出して認可コードをアクセストークンや更新トークンと交換します。このアクセストークンは非同期の応答を送信する際に使用します。
AcceptGrantディレクティブを正しく処理していない場合はアカウントリンクが失敗します。開発者コンソールから「Alexaイベントを送る」を無効にするとアカウントリンクが成功する場合、AcceptGrantディレクティブが原因となりますので、AcceptGrant.Responseイベントで正しく応答していることをご確認ください。
Alexaが提供された更新トークンで新しいアクセストークンと更新トークンのペアを取得できなかった可能性があります。アクセストークンの有効期限は6分以上、またはexpires_inパラメータで360以上に設定する必要があります。また、開発者コンソールから設定できるデフォルトのアクセストークンの有効期限が360秒以上であることを確認してください。
アクセストークンレスポンスの例:
HTTP/1.1 200 OK
Content-Type: application/json;charset UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"Atza|EXAMPLEACCESSTOKEN123456...",
"token_type":"bearer",
"expires_in":360,
"refresh_token":"Atzr|EXAMPLEREFRESHTOKEN123456X..."
}
認証サーバーが更新トークンで新たなアクセストークンと更新トークンのペアを発行できることを確認してください。また、更新トークンは有効期限がない設定にするか、有効期限が切れた場合でも一定数の古い更新トークンを有効なままにしておくことをお勧めします。更新トークンの有効期限が切れてAlexaサービスは新しいトークンペアを取得できない場合は、ユーザーがAlexaアプリから再度アカウントリンクする必要があります。
一つのデバイスでアカウントリンクが成功しても、他のデバイスでアカウントリンクに失敗することがあります。例えば、ブラウザではアカウントリンクが成功し、モバイルのAlexaアプリでは失敗します。これは、アカウントリンクの設定で特定のドメインがドメインリストに登録されていないことが原因の可能性があります。
アカウントリンクの過程で接続する外部のドメインが全て追加されていることを確認してください。例えば、oauth.sample.comに接続する場合は、sample.comだけではなくoauth.sample.comを追加する必要があります。
これは通常、redirect_uriに問題があるかリダイレクトURLが無効であることが原因です。例外として、リクエストのサイズ(リダイレクトのURL、全てのドメインのクッキーを含む)が大きすぎる場合にも発生します。
シークレットウィンドウやプライベートウィンドウでアカウントリンクをテストしてみてください。それらでアカウントリンクが成功する場合はリクエストのサイズが原因となります。リダイレクトURLは全てのクエリパラメーターを含むため長くなることがありますが、このリダイレクトURLのサイズを減らす必要があります。特に認証コードが長くなりがちなので、認証コードを短くすることをお勧めします。
このブログではアカウントリンクの実装でよく起きる問題についてご紹介しました。アカウントリンクの問題はこちらのフォーラム(英語)にも掲載されておりますので参考になさってください。