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/15にクローズされました