Closed4

サーバーレスLaravelでCognito認証する方法

つまりAPI Gatewayには単にVPC Laravelをinvokeしてレスを返すだけのLambdaを繋げる。
バイパスするついでにBearerトークンをUserテーブルに保存してあるCognitoSubに書き換えた。
中間のLambdaはnode.jsで書きました。

中間Lambdaのindex.js

const { Lambda, CognitoIdentityServiceProvider } = require('aws-sdk');
const lambda = new Lambda();
const cognitoIdentityServiceProvider = new CognitoIdentityServiceProvider();

const modifyAuthHeader = async (event) => {
  const authHeader = event.headers["Authorization"] || event.headers["authorization"]
  if (authHeader) {
    const params = {
      AccessToken: authHeader.split(" ")[1],//Bearerトークン取得
    };
    try {
      const cognitoUser = await cognitoIdentityServiceProvider.getUser(params).promise();
      event.headers.Authorization = `Bearer ${cognitoUser.Username}`
    }
    catch (e) {
      delete event.headers.Authorization
    }
  }
  return event
}

exports.handler = async (event) => {
  //Bearerトークンの書き換え
  event = await modifyAuthHeader(event)

  //RequestをLaravelに送って
  const response = await lambda.invoke({
    FunctionName: process.env.FUNCTION_NAME,
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify(event)
  }).promise();

  //ResponseをAPI Gatewayに返す
  const res = JSON.parse(response.Payload)
  return res
}

あ、Cognitoのポリシー付けるの忘れるなよー

cognito-idp:GetUser ← これな

このスクラップは2021/07/14にクローズされました
ログインするとコメントできます