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 grantAuthorization 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ですが、サービスによって必要なデータがある場合はカスタムしておきましょう。

    試すだけならデフォルトのままでOK

    アプリクライアントを作成する

    Alexa Skillから利用するためのクライアントを作成します。

    ここも試すだけであれば特に設定をする必要はありません。

    webUIを作りたい・会員APIを提供したい・カスタム属性のデータを取得したいなどの場合は少し設定が必要ですが、前者2つについては別途それ用のクライアントを作成した方がいいかなと思います。

    作成すると「アプリクライアントID」が表示されます。

    この後の設定にコールバック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スキル]から作成したスキルを探しましょう。

    「アカウントのリンクが必要です」と表示されます

    アカウントリンクの簡単なテスト方法は、この画面でスキル名をクリックした後、「一度スキルを無効化した後で有効化すること」です。

    「有効にする」ボタンをクリックすると、自動的に認証画面に遷移してくれます。

    Cognito User Poolのリソースサーバーログイン画面


    ※AWSマネジメントコンソールで追加したユーザーの場合、この後パスワードの変更を要求されます。

    認証に成功した場合、「正常にリンクされました」という画面が表示されます。

    Cognito User Poolからのデータ取得テスト

    あとはAlexa Skill開発画面の[テスト]にある[サービスシュミレーター]で「hello 」というレスポンスが返ってくるかをテストしましょう。

    Cognito User Poolに登録したユーザー名がレスポンスに含まれている。

    アカウントリンクに成功していれば、Alexa SkillからLambdaに渡されたアクセストークンを使って、Cognito UserPoolからユーザー名を返すことができています。

    おわりに

    アカウントリンクができるようになるといろいろ夢が広がりますね。

    なおアカウントリンクを設定している場合は、[設定]の[プライバシーポリシー URL]が空欄だと申請ボタンがアクティブになりませんのでご注意ください。

    もう片方の認証タイプについても時間をつくってトライしてみたいと思いますので、進捗あり次第また記事にします。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark