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

AWS Cognito在JavaScript中调用initiateAuth返回空响应问题求助

AWS Cognito在JavaScript中调用initiateAuth返回空响应问题求助

看起来你遇到的问题核心在于AWS SDK for JavaScript的initiateAuth方法是异步操作,你当前的代码直接把方法返回的请求上下文对象(还未完成请求的状态)当成了最终响应,所以才会看到那个data为null的结构——这其实是SDK的请求包装对象,不是Cognito返回的实际认证结果。

Django里的SDK调用可能是同步实现的,或者你用了同步的调用方式,但JS SDK的浏览器/Node.js版本都是异步设计的,必须通过异步方式等待请求完成才能拿到真实响应。


核心解决方案:处理异步调用

下面是两种正确的异步调用方式,选一种即可:

方案1:使用async/await(推荐,代码更简洁易读)

需要把认证逻辑包裹在async函数中,用await等待请求完成:

// 把认证逻辑放在async函数内
async function authenticateUser() {
    var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({region: 'eu-central-1'});

    const poolData = {
        UserPoolId: "userPoolId",
        ClientId: "clientId",
    }

    let username = document.getElementById('username').value;
    let password = document.getElementById('password').value;
    var aws_params = {
        AuthFlow: "USER_PASSWORD_AUTH", 
        AuthParameters: {
            "PASSWORD": password, 
            "SECRET_HASH": "secretHash", // 注意:这里建议用动态生成的正确值,后面会说明
            "USERNAME": username
        }, 
        ClientId: "clientId", 
    };

    try {
        // 用await等待异步请求完成,调用.promise()获取Promise对象
        const response = await cognitoidentityserviceprovider.initiateAuth(aws_params).promise();
        console.log("Cognito返回的实际响应:", response);
        // 这里可以拿到token:response.AuthenticationResult.IdToken/AccessToken等
    } catch (error) {
        console.error("认证失败,错误信息:", error);
        // 根据error.message或error.code可以定位具体问题,比如SecretHash错误、用户不存在等
    }
}

// 触发认证
authenticateUser();

方案2:使用Promise的.then()链式调用

如果你的环境不支持async/await(比如旧版浏览器),可以用传统的Promise回调方式:

var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({region: 'eu-central-1'});

// ... 省略获取username、password和构造aws_params的代码(和之前一致) ...

// 调用.promise()并通过then/catch处理结果
cognitoidentityserviceprovider.initiateAuth(aws_params).promise()
    .then(response => {
        console.log("Cognito返回的实际响应:", response);
        // 处理返回的token数据
    })
    .catch(error => {
        console.error("认证出错:", error);
        // 处理具体错误
    });

额外需要验证的关键点

  1. SecretHash的正确性
    如果你的Cognito应用客户端配置了App client secret,SecretHash不能写死成固定字符串,必须是用用户名 + 客户端ID + 客户端密钥生成的HMAC-SHA256哈希值。浏览器端可以用以下代码生成:
async function calculateSecretHash(username, clientId, clientSecret) {
    const encoder = new TextEncoder();
    const message = encoder.encode(username + clientId);
    const key = encoder.encode(clientSecret);
    
    const hashBuffer = await crypto.subtle.digest('SHA-256', message);
    return btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));
}

// 使用示例:
const secretHash = await calculateSecretHash(username, "yourClientId", "yourClientSecret");
  1. 确认客户端启用了USER_PASSWORD_AUTH流
    登录AWS控制台,进入你的Cognito用户池 → 应用客户端 → 显示详情 → 确认“启用的认证流程”中包含ALLOW_USER_PASSWORD_AUTH,如果没有需要手动开启。

  2. 配置参数的一致性
    确保JS代码中的区域、ClientId、UserPoolId和Django代码中使用的完全一致,没有拼写错误。


处理好异步调用后,你应该就能拿到和Django里一样的包含IdToken、AccessToken的响应了。如果还有问题,可以在catch中打印完整的error对象,Cognito会返回具体的错误提示(比如SecretHash无效、用户未验证等),这会帮你快速定位问题。

备注:内容来源于stack exchange,提问作者CanAnyOneHelpMe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:09:30