Cognitoを使ったGoogle Homeのアカウントリンク
渡辺です。 北海道では初雪(初冠雪)の便りが届きました、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スキルの場合と同じです。 すなわち、次のような流れになります。
- Cognitoでユーザプールを作成する
- Google Home(アクション)を設定する
- CognitoでOAuth2を設定する
- Google Home(アクション)でアカウントリンクを有効にし、Cognito/OAuth2のパラメータを設定する
- アカウントリンクを行う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は「aws.cognito.signin.user.admin
を指定します。
START DEMOをクリックすれば、CognitoのログインUIが表示され、ログインすることでアカウントリンクが行われるでしょう。
まとめ
今回、Cognitoを利用してActionsのアカウントリンクを試してみました。 Google HomeのアクションやAlxeaのスキルでアカウントリンクを行う場合、比較的簡単に使えるのがCognitoのユーザプールです。 やり方は抑えておきましょう。