You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Cognito在Lambda函数中登录失败,提示未知错误

排查Lambda中Cognito认证返回“未知错误”的问题

首先,我得帮你梳理下为什么同样的逻辑在静态网站能跑,Lambda里却报错——核心差异在于运行环境(浏览器 vs Node.js/Lambda)、权限模型(前端用户身份 vs Lambda执行角色)和打包方式,咱们一步步来排查:

1. 先查CloudWatch日志,拿到真实错误信息

Lambda控制台显示的“未知错误”太模糊了,你得去CloudWatch日志组里找对应的Lambda日志,里面会有具体的错误栈或者报错信息,比如是依赖缺失、权限不足还是网络不通,这是最关键的第一步。

2. 检查Webpack打包配置(大概率是这里的问题)

你的静态网站是浏览器环境,但Lambda是Node.js环境,而你的webpack.config.js没有设置target: 'node',Webpack默认会按浏览器环境打包,会把Node.js核心模块(比如http、fs)替换掉或者忽略,而amazon-cognito-identity-js在Node.js里需要这些模块,导致打包后的代码在Lambda里运行出错。

修改webpack配置,加上target: 'node':

var path = require('path');
module.exports = {
  entry: './index.js',
  target: 'node', // 新增这一行,告诉Webpack打包成Node.js兼容的代码
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-app.js'
  },
  module: {
    rules: [
      { test: /\.json$/, loader: 'json-loader' }
    ]
  }
};

另外,Webpack 4+已经内置了JSON解析,json-loader其实可以不用,你可以删掉对应的规则和依赖,简化配置。

3. 确认Lambda执行角色的Cognito权限

前端调用Cognito是直接从浏览器发起,走的是Cognito客户端的公开配置;但Lambda是服务器端调用,需要通过IAM角色获得权限。你需要给Lambda的执行角色添加允许Cognito认证的策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "cognito-idp:InitiateAuth",
      "Resource": "arn:aws:cognito-idp:<你的AWS区域>:<你的AWS账号ID>:userpool/<你的用户池ID>"
    }
  ]
}

把占位符替换成你实际的信息,比如区域是us-east-2,账号ID是你的12位数字ID。

4. 检查依赖版本兼容性

你的amazon-cognito-identity-js是v2.0.3,这个版本依赖的是node-fetch v2.x,如果你装的是node-fetch v3+(ESM模块),用require('node-fetch')会报错,因为v3不支持CommonJS。

修改package.json,指定node-fetch的版本:

"dependencies": {
  "amazon-cognito-identity-js": "^2.0.3",
  "node-fetch": "^2.6.7"
}

然后重新安装依赖:npm install

5. 修正Lambda回调的错误传递

你的onFailure回调里的写法有问题:callback(JSON.stringify(err), event);,Lambda的callback格式是callback(error, result),第一个参数是错误对象,第二个是成功结果。你现在把错误转成字符串当第一个参数,event当结果,会导致错误信息被处理成字符串,Lambda控制台无法正确解析成错误。

改成这样:

onFailure: function(err) {
  console.error('认证失败:', err); // 先打日志方便排查
  callback(err); // 直接传递Error对象
},

6. 检查Cognito客户端的密钥设置

如果你的Cognito用户池客户端开启了“生成客户端密钥”,那么服务器端调用认证时必须计算SecretHash并传入AuthenticationDetails,而前端SDK因为无法安全存储密钥,通常用的是无密钥的客户端(所以静态网站能跑)。

如果你的客户端有密钥,需要添加SecretHash的计算逻辑:

const crypto = require('crypto');

// 在创建authenticationData之前计算SecretHash
const clientSecret = '<你的Cognito客户端密钥>'; // 从Cognito控制台获取
const secretHash = crypto.createHmac('SHA256', clientSecret)
  .update(username + poolData.ClientId)
  .digest('base64');

var authenticationData = {
  Username : username,
  Password : password,
  SecretHash: secretHash // 添加这一行
};

7. 排查VPC网络问题(如果Lambda配置了VPC)

如果你的Lambda部署在VPC里,需要确保子网有NAT网关,能访问公网(Cognito的服务端点在公网)。如果没有NAT网关,Lambda无法连接到Cognito,会超时或者返回未知错误。静态网站是从公网直接访问Cognito,所以不受影响。


内容的提问来源于stack exchange,提问作者david liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:47