Cognitoの未認証ユーザの機能をAPI Gatewayで使用(Node.js)

  • 2020.09.06
  • AWS
NO IMAGE

Cognitoでは認証をしていないユーザー(ゲストユーザー)にロールを設定することができるので、その機能を使ってみました。
この機能をAPI Gatewayに使用することで、未認証ユーザ用のクレデンシャルを付与しないとAPIにアクセスできないため、認証は不要だけどどこからでもアクセスされるのは防ぎたいという要件を満たすことができます。

ポイント

Cognitoの未認証ユーザの機能を実装するにあたり、自分が理解できていなかったことがいくつかあったのでポイントとしてまとめておこうかと思います。

その1:未認証ユーザの機能はCognitoのIDプールの機能である

Coginitoには認証の機能を提供するユーザプールと認可の機能を提供するIDプールがあります。これまで自分が使ったことがあったのがユーザプールのみで、IDプールは使用したことがなかったので、最初はユーザプールの機能に未認証ユーザの機能があるのかと勘違いしていました。IDプールとユーザプールの関係としては、IDプールの認証プロバイダとして、ユーザプールを使用することができる、といったイメージです。

その2:API GatewayにはIAM認証を設定することになる

冒頭にも記載したように、今回行うのは、認証をしていないユーザー用のロールを設定して、その権限を付与するという作業なので、API Gatewayで設定する認証のタイプは「AWS_IAM」となります。

前提

以下作業を行います。

  • Amazon Cognitoのアイデンティティプールを作成
  • Cognitoの未認証のロールにAPI Gatewayのアクセスの権限を付与
  • 対象となるAPI Gatewayの認可の設定箇所で「AWS_IAM」を選択

実装したコード

実装したコードとしては以下になります。IdentityPoolId、invokeUrl、pathTemplateの箇所はそれぞれ編集ください。

const AWS = require('aws-sdk');
const apigClientFactory = require('aws-api-gateway-client').default;

const credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId:'xxx'
});
AWS.config.update({
  credentials: credentials,
  region: 'ap-northeast-1'
});
AWS.config.credentials.get(function(err){
    if(!err){
        const apigClient = apigClientFactory.newClient({
            accessKey: AWS.config.credentials.accessKeyId,
            secretKey: AWS.config.credentials.secretAccessKey,
            sessionToken: AWS.config.credentials.sessionToken,
            region: 'ap-northeast-1',
            invokeUrl: 'xxx'
        });
        const params = {
        };
        const pathTemplate = 'xxx';
        const method = 'GET';
        const additionalParams = {
            queryParams: {
            }
        };
        const body = {
        };
        apigClient.invokeApi(params, pathTemplate, method, additionalParams, body)
            .then(function(result){
                console.log(result.data);
            })
            .catch(function(result){
                console.log(result);
            });
    }else{
        console.log(err)
    };
});