Cognitoを使ったGoogle Homeのアカウントリンク

2018.08.20

渡辺です。 北海道では初雪(初冠雪)の便りが届きました、8月ですけど。

AlexaやGoogle Homeでは、スキル(アクション)のアカウントリンクを利用することで、アカウントの情報にアクセスできます。 AlexaでもGoogle Homeでも、アカウントリンクの機能はほとんど変わりません。 スキル(アクション)を利用するユーザと、別途管理されているユーザを紐付けることで高度な機能を提供できます。 Alexaの場合はAmazonアカウントとリンクすること、Google HomeではGoogleアカウントとリンクすることが簡単です。 しかし、 独自システムのユーザと紐付ける場合、OAuth2の利用が前提 となっています。

独自システムが、OAuth2に対応していれば難しいことはありません。 しかし、OAuth2に対応した独自システムは珍しいですし、OAuth2に対応させることも簡単ではありません。 なので、 簡単にOAuth2対応システムを構築できるCognitoを利用する のはひとつの解決方法です。 認証システムをCognito側に寄せる必要はありますが、既存システムをOAuth2対応するよりは簡単なケースが多いと思います。

Alexaスキルで利用する場合は、Cognito User Pool によるアカウントリンクを参照ください。 こちらのエントリーでは、Google Homeで利用する場合の設定手順について解説します。

概要

設定の流れは、Alexaスキルの場合と同じです。 すなわち、次のような流れになります。

  1. Cognitoでユーザプールを作成する
  2. Google Home(アクション)を設定する
  3. CognitoでOAuth2を設定する
  4. Google Home(アクション)でアカウントリンクを有効にし、Cognito/OAuth2のパラメータを設定する
  5. アカウントリンクを行うUIを作成する

Alexaスキルの場合と異なるのは、 アカウントリンクするUIを自分で作る ことです。 Alexaスキルの場合、スキルの管理ツールからアカウントリンクを行えます。 このため、スキル設定のみでアカウントリンクが可能です。

ユーザプールの作成

はじめに、Cognitoのユーザプールを作成します。 手順はAlexaスキルの場合と同じですので、Cognito User Pool によるアカウントリンクを参照ください。

アクションの作成

Googleアカウントでログインし、アクションを作成します。

忘れずにlanguageをJapaneseにしましょう。

Actionsを設定します。 BUILDのActionsメニューを選び、ADD YOUR FIRST ACTION をクリックしてください。

Custom intentを選択し、Buildをクリックします。

DialogFlowはアクションの定義を行う部分です。 Alexaスキルと同様にIntentを定義し、対応するレスポンスを定義します。 DEFAULT LANGUAGEでJapanese - ja を選択しましょう。

CREATE INTENTをクリックし、Intentを作成します。

HelloインテントはTraning Phrase(Alexaスキルのサンプルフレーズ)に「こんにちは」と定義しました。 Responseに「はい、こんにちは」を追加し、「Set this intent as end of conversation」にチェックをいれます。 アクション(DialogFlow)では、単純になにか応答するだけの機能であれば、Fulfilment(Lambdaに相当するロジック)は不要です。

アクション画面に戻り、動作確認します。 TEST/Simulatorメニューを開き、LanguageをJapanese - jaに変更し、START TESTINGをクリックします。

動作確認ができました。

最後に、SettingsからProject IDをコピーしておきます。

ユーザプールにOAuth2の設定を行う

ユーザプールのアプリ設定を行い、OAuth2を利用できるように設定します。

はじめにアプリクライアントを追加して、クライアントIDとシークレットキーを払い出します。

ドメイン名を設定します。

最後にアプリクライアントの設定を行います。

有効なIDプロバイダにユーザプールを指定してください。 OAuth2.0のフローは「Authorization code grant」にチェックを入れます。 許可されるOAuthスコープは、「aws.cognito.signin.user.admin」を選択しました。 ここまではAlexaスキルの場合と同じです。

コールバックURLとサインアウトURLには次を設定してください。

コールバックURL https://oauth-redirect.googleusercontent.com/r/<アクションのProject ID>

サインアウトURL https://gala-demo.appspot.com/

後述しますが、今回は独自のUIを作成せず、Googleで提供しているサンプルUIを使い、認証設定を行います。

以上でCognito側の設定は完了です。

アクションのアカウントリンク設定

アクション側のアカウントリンク設定です。 アクションのAccount linkingメニューを開き、設定を行います。

Account creatationは外部IDとリンクを行うため、「No, I only want to allow account creation on my website」を選択します。 Linking typeはOAuth/Autorization codeを選択してください。

ClinentIDとClient secretにはユーザプールのアプリクライアントで払い出した値を設定します。 Authorization URL と Token URL は、次の値を設定してください。

Authorization URL: https://<ドメイン名>.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize

Token URL: https://<ドメイン名>.auth.ap-northeast-1.amazoncognito.com/oauth2/token

スコープ設定は、aws.cognito.signin.user.adminを指定します。

最後にActionがDialog Flowを呼び出した時に、認証を必要とするようにIntegrationを設定しましょう。

あわせて、設定が即時反映されるように変更します。

動作確認

本来は認証用のUIを作成する必要がありますが、Googleでテスト用汎用UIが提供されています。 今回はそれを使ってアカウントリンクをテストしてみましょう。

シミュレータを起動し、アクションを呼び出します。

アカウントリンクが必要なメッセージが返されました。 ここで、アカウントリンク用のUI(サイト)へ誘導し、アカウントリンクを行います。 今回は、https://gala-demo.appspot.com/ を利用します。

はじめにGoogleのアカウントにサインインします。 ServiceIDは「_dev」とし、スコープはaws.cognito.signin.user.adminを指定します。

START DEMOをクリックすれば、CognitoのログインUIが表示され、ログインすることでアカウントリンクが行われるでしょう。

まとめ

今回、Cognitoを利用してActionsのアカウントリンクを試してみました。 Google HomeのアクションやAlxeaのスキルでアカウントリンクを行う場合、比較的簡単に使えるのがCognitoのユーザプールです。 やり方は抑えておきましょう。