使用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
相关产品推荐
相关产品推荐

