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

使用Amplify.Auth通过CUSTOM_AUTH_WITHOUT_SRP无密码登录遇ServiceException

解决AWS Amplify Auth自定义无密码登录“不支持此登录方法”问题

核心问题排查与修复步骤

1. 配置用户池应用客户端的认证流程

  • 登录AWS控制台,进入目标Cognito用户池 → 选择对应应用客户端 → 编辑「认证流程配置」
  • 必须勾选**自定义认证(CUSTOM_AUTH)**选项(控制台无单独的CUSTOM_AUTH_WITHOUT_SRP选项,它属于CUSTOM_AUTH的子场景,由Lambda逻辑控制是否跳过SRP验证)
  • 保存配置后等待生效

2. 修正Amplify配置文件

打开项目中的amplifyconfiguration.json,确认auth模块的authenticationFlowType设置为CUSTOM_AUTH,示例配置片段:

"auth": {
    "plugins": {
        "awsCognitoAuthPlugin": {
            "userPoolId": "你的用户池ID",
            "userPoolWebClientId": "你的客户端ID",
            "region": "你的区域",
            "authenticationFlowType": "CUSTOM_AUTH"
        }
    }
}

3. 确保自定义认证Lambda响应符合规范

即使Lambda返回“成功”,响应格式不符合Cognito要求也会触发报错。针对无密码登录场景,Lambda需返回正确结构:

exports.handler = async (event) => {
    if (event.triggerSource === "CustomAuthentication_Authentication") {
        // 替换为你的实际用户验证逻辑(如验证码校验)
        const isUserValid = true;
        if (isUserValid) {
            return {
                status: "SUCCESS",
                authenticationResult: {
                    userId: event.userName,
                    tokens: {
                        idToken: "生成的ID Token",
                        accessToken: "生成的Access Token",
                        refreshToken: "生成的Refresh Token"
                    }
                }
            };
        } else {
            return { status: "FAILURE", message: "验证失败" };
        }
    }
    return event;
};

4. 调整Amplify登录代码逻辑

CUSTOM_AUTH流程需处理挑战响应,不能直接通过单次signIn调用完成,示例Kotlin代码:

Amplify.Auth.signIn(
    username,
    AWSCognitoAuthSignInOptions.builder()
        .authFlowType(AuthFlowType.CUSTOM_AUTH)
        .build(),
    { result ->
        if (result.isSignInComplete) {
            // 登录成功逻辑
        } else {
            val challenge = result.nextStep.signInChallenge
            // 处理自定义挑战(如提示用户输入验证码)
            Amplify.Auth.respondToAuthChallenge(
                challenge.challengeName,
                mapOf("ANSWER" to "用户输入的验证凭证"),
                { challengeResult ->
                    if (challengeResult.isChallengeComplete) {
                        // 挑战完成,登录成功
                    }
                },
                { error -> Log.e("Auth", "挑战响应失败", error) }
            )
        }
    },
    { error -> Log.e("Auth", "登录失败", error) }
)

5. 验证Lambda执行角色权限

确保Lambda的IAM角色拥有cognito-idp:AdminRespondToAuthChallenge、cognito-idp:AdminInitiateAuth等必要权限,避免因权限不足导致流程中断


内容的提问来源于stack exchange,提问作者Jignesh Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:05:15