AWS Cognito和API网关使用Lambda授权者的解决方法包括以下步骤和代码示例:
exports.handler = async (event) => {
// 从API网关的请求事件中获取Cognito用户池ID和客户端ID
const userPoolId = event.requestContext.authorizer.claims.iss.split('/').slice(-1)[0];
const clientId = event.requestContext.authorizer.claims.aud;
// 检查请求事件的Cognito用户令牌是否有效
const isValidToken = await validateCognitoToken(event.headers.Authorization, userPoolId, clientId);
if (isValidToken) {
// 授权成功,返回原始事件
return event;
} else {
// 授权失败,返回未授权错误
throw new Error('Unauthorized');
}
};
// 验证Cognito用户令牌的函数
const validateCognitoToken = async (token, userPoolId, clientId) => {
// 使用AWS SDK调用Cognito的ID令牌验证接口
const cognito = new AWS.CognitoIdentityServiceProvider();
const params = {
AccessToken: token,
UserPoolId: userPoolId
};
try {
// 验证用户令牌
const response = await cognito.getUser(params).promise();
// 检查返回的客户端ID是否匹配
if (response.UserClientMetadata.client_id === clientId) {
return true;
} else {
return false;
}
} catch (err) {
console.log(err);
return false;
}
};
创建一个API网关,并在“授权者”中选择“AWS Cognito用户池”。配置Cognito用户池的详细信息,包括用户池ID和客户端ID。
在API网关的资源或方法中,选择“授权”并选择刚创建的授权者。
使用API网关的URL调用API,并在请求头中包含Cognito用户令牌。如果令牌有效,则API网关会将请求转发给Lambda函数。
请注意,以上代码示例中的AWS SDK和其他依赖项需要在Lambda函数的环境中正确配置。