【发布时间】:2021-05-04 22:40:59
【问题描述】:
我正在使用 node.js 和 AWS Lambda 开发一个无服务器项目。 对于身份验证,我使用的是 AWS Cognito。 (前端是 AWS Amplify 上的 Vue.js 中的网络应用程序)。
我想编写自己的实现来重置忘记密码的用户的密码。
基本上,最终用户使用他们的电子邮件填写表格。如果系统中有电子邮件,我会向他们发送一个重置链接(我在数据库中设置了一个唯一代码)。
我知道Cognito's Forgot Password flow 以及一个解决方案,在该解决方案中我可以捕获 Cognito 的“电子邮件发送”代码并使用我自己的模板覆盖电子邮件,并在提到的 URL 中传递代码here。
我偶然发现了 adminSetUserPassword API,我确信它可以工作 - 但无论我做什么,我的 lambda 函数都没有权限执行此操作。
这是我的 nodejs 代码:
import AWS from 'aws-sdk';
const COGNITO_POOL_ID = process.env.COGNITO_USERPOOL_ID;
const csp = new AWS.CognitoIdentityServiceProvider();
export async function resetUserPassword(username, newPassword) {
// Constructing request to send to Cognito
const params = {
Password: newPassword,
UserPoolId: COGNITO_POOL_ID,
Username: username,
Permanent: true,
};
await csp.adminSetUserPassword(params).promise();
return true;
}
这是我对 lambda 函数的 IAM 权限(它是无服务器 yml 格式):
CognitoResetPasswordIAM:
Effect: Allow
Action:
- cognito-idp:*
Resource:
- arn:aws:cognito-idp:us-east-1::*
(一旦可行,我将微调权限)
以下是我收到的错误消息。 我开始觉得我做这件事的方法不是推荐的做事方式。
用户:arn:aws:sts::[XXXXXXX]:assumed-role/[YYYYYYYYY]-us-east-1-lambdaRole/web-app-service-dev-resetPassword 无权执行:cognito-idp :AdminSetUserPassword 资源:arn:aws:cognito-idp:us-east-1:[[XXXXXXX]]:userpool/us-east-1_ZZZZZZZZ
(Serverless 可以访问我的 AWS 访问密钥,并且对 * 资源具有 * 权限——所以我认为我没有遗漏任何权限)。
我的问题:
- 这是推荐的方法吗?
- 我是否可以配置权限,使我的 lambda 函数具有执行此操作所需的权限?
【问题讨论】:
-
你有什么解决办法吗?
-
@SushantSomani 我在下面分享了我的解决方案。感谢您的检查。我忘了我在 Stack Overflow 上问过。如果您有任何疑问,请告诉我。