Implicit grantでAWS Cognito User PoolとAlexa Skillをリンクする
いつのまにかCognito User PoolでOAuth認証ができるようになっていましたので、さっそくAlexa Skillのアカウントリンクを試してみました。 Implicit grantとAuthorization […]
目次
いつのまにかCognito User PoolでOAuth認証ができるようになっていましたので、さっそくAlexa Skillのアカウントリンクを試してみました。
Implicit grantとAuthorization code grant
Alexa Skillのアカウントリンク機能では、アクセストークンの取得にImplicit grant
とAuthorization code grant
の2つが選べます。
Cognito User Pool側はこのどちらにも対応していますので、今回はとりあえず設定項目の少ないImplicit grant
のほうを使います。
「単なる OAuth 2.0 を認証に使うと、車が通れるほどのどでかいセキュリティー・ホールができる | @_Nat Zone」という記事があったりするので、実運用ではAuthorization code grant
の方を使った方が良さそうかもです。
grantの種類やフローについてはIPAの「セキュリティトークンとOAuth 2.0」が参考になります。
Cognito User Poolのセットアップ
User Poolを作成する
まずはUser Poolを作成します。デフォルトの設定でとりあえず作っておけばOKですが、サービスによって必要なデータがある場合はカスタムしておきましょう。
アプリクライアントを作成する
Alexa Skillから利用するためのクライアントを作成します。
ここも試すだけであれば特に設定をする必要はありません。
webUIを作りたい・会員APIを提供したい・カスタム属性のデータを取得したいなどの場合は少し設定が必要ですが、前者2つについては別途それ用のクライアントを作成した方がいいかなと思います。
この後の設定にコールバックURLなどが必要になりますので、User Poolの設定はここで一時中断してAlexa Skillの準備を始めます。
Alexa Skillのセットアップ
先ほどのUser Poolと連携させるためのSkillを作ります。
スキル情報や対話モデルを準備する
このあたりの情報がないとSkillとして動かすことができないので、設定しておきましょう。
この記事では[AccountLinkingTestIntent]というインテントを1つ用意しています。
インテントスキーマ
{
"intents": [
{
"intent": "AccountLinkingTestIntent"
},
{
"intent": "AMAZON.HelpIntent"
},
{
"intent": "AMAZON.StopIntent"
},
{
"intent": "AMAZON.CancelIntent"
}
]
}
サンプル発話
AccountLinkingTestIntent what is my mane
AccountLinkingTestIntent what's my name
AccountLinkingTestIntent tell me my name
AccountLinkingTestIntent tell my name
AccountLinkingTestIntent name
ちゃんと理解したい人へ
公式のブログ記事にLogin with Amazonを使ったチュートリアルがありますので、そちらを先にやってみてください。
アカウントリンクの設定をする
[設定]に移動すると、[アカウントリンク]という項目があります。
[認証の承諾タイプ]を[Implicit Grant]にした後で、[リダイレクトURL]に表示されているURLを1つコピーしましょう。
URLは複数表示されますが、どれか1つで大丈夫です。
Cognito User PoolでOAuth 2.0の設定をする
必要な値が手に入ったので、User Poolに戻ってOAuth 2.0の設定を進めます。
アプリクライアントの設定をする
[アプリの統合] > [アプリクライアントの設定]へ移動しましょう。
入力欄が色々出てきますので、以下のように設定します。
Name | Value |
---|---|
有効な ID プロバイダ | Cognito User Pool |
コールバックURL | <先ほどコピーした「リダイレクトURL> |
サインアウトURL | https://alexa.amazon.com/spa/index.html |
許可されている OAuth フロー | Implicit grant |
許可されている OAuth スコープ | aws.cognito.signin.user.admin |
ドメイン名を設定する
ログインやトークンの取得に利用するためのURLがまだありませんので、[アプリの統合] > [ドメイン名]から設定します。
https://<YOUR_DOMAIN>.auth.<REGION>.amazoncognito.com
というドメインが発行されますので、[使用可能かチェック]で重複チェックをした上で登録しましょう。
Alexa Skillの設定を進める
これでUser Pool側の準備はできましたので、Alexa Skillの準備を進めていきましょう。
AWS Lambdaを用意する
まずはAlexa Skillがよび出すLambdaを用意します。
ここの解説は面倒なのでもやると記事量がかなり長くなりそうなので、簡単なサンプルコードを用意しました。
https://github.com/hideokamoto/alexa-hello-cognito-userpool
$ git clone [email protected]:hideokamoto/alexa-hello-cognito-userpool.git
$ cd alexa-hello-cognito-userpoo
$ npm install
## デプロイ
$ sls deploy --region us-east-1
## ARNの取得
$ aws lambda list-functions --region us-east-1 | grep cognito | grep Arn
"FunctionArn": "arn:aws:lambda:us-east-1:999999:function:alexa-hello-cognito-userpool-development-hello",
取得したLambdaのARNをエンドポイントのデフォルトに入力しましょう。
Alexa Skillのアカウントリンクを設定する
最後にアカウントリンクの設定をします。
入力するデータ
Name | Value |
---|---|
認証URL | <後述> |
クライアントID | Cognito User PoolアプリクライアントID |
スコープ | aws.cognito.signin.user.admin |
認可の承諾タイプ | Implicit grant |
[認証 URL]の作り方
認証 URLはCognito Auth APIの認証エンドポイントを使用します。
公式ドキュメントのサンプルは以下のようになっています。
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=ad398u21ijw3s9w3939&
redirect_uri=https://YOUR_APP/redirect_uri&
state=STATE&
scope=aws.cognito.signin.user.admin&
code_challenge_method=S256&
code_challenge=CODE_CHALLENGE
今回の場合は、以下のように値を置き換えてURLを組み立てましょう
https://example-userpool-for-alexa.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=<User PoolのアプリクライアントID>&
redirect_uri=<User Poolのアプリクライアントで登録したコールバックURL>&
state=STATE&
scope=aws.cognito.signin.user.admin&
code_challenge_method=S256&
code_challenge=CODE_CHALLENGE
テストする
[準備]Cognito User Poolにユーザーを作成する
[ユーザーとグループ] > [ユーザーの作成]からユーザーの作成ができます。
アカウントリンクのテストのために必要ですので、少なくとも1ユーザー登録しておきましょう。
アカウントリンクのテストをする
https://alexa.amazon.co.jp/ または https://alexa.amazon.com/ にアクセスします。
[スキル] > [有効なスキル] > [DEVスキル]から作成したスキルを探しましょう。
アカウントリンクの簡単なテスト方法は、この画面でスキル名をクリックした後、「一度スキルを無効化した後で有効化すること」です。
「有効にする」ボタンをクリックすると、自動的に認証画面に遷移してくれます。
※AWSマネジメントコンソールで追加したユーザーの場合、この後パスワードの変更を要求されます。
認証に成功した場合、「正常にリンクされました」という画面が表示されます。
Cognito User Poolからのデータ取得テスト
あとはAlexa Skill開発画面の[テスト]にある[サービスシュミレーター]で「hello
アカウントリンクに成功していれば、Alexa SkillからLambdaに渡されたアクセストークンを使って、Cognito UserPoolからユーザー名を返すことができています。
おわりに
アカウントリンクができるようになるといろいろ夢が広がりますね。
なおアカウントリンクを設定している場合は、[設定]の[プライバシーポリシー URL]が空欄だと申請ボタンがアクティブになりませんのでご注意ください。
もう片方の認証タイプについても時間をつくってトライしてみたいと思いますので、進捗あり次第また記事にします。