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

Android端AWS Amplify CUSTOM_AUTH登录传自定义数据问题咨询

AWS Amplify Android CUSTOM_AUTH 自定义参数传递方案

CUSTOM_AUTH流程不支持通过自定义请求头直接透传业务参数到Lambda触发器,首次调用signIn()传入的clientMetadata无法被第一个触发的Define Auth Challenge触发器读取,是Cognito与Amplify的默认机制限制,不是参数写法错误。

以下是三种可落地的实现方式:

方案1:适配CUSTOM_AUTH参数透传规则(推荐,无额外配置)

  • 先明确透传规则:首次signIn()传入的clientMetadata,不会传递给首个Define Auth Challenge触发器,但会在后续触发的Create Auth Challenge、Verify Auth Challenge触发器事件中完整携带。
  • 适配步骤:
    • 配置Define Auth Challenge触发器,首次触发时固定返回「等待选择OTP渠道」的自定义挑战,不执行OTP发送逻辑
    • Android端收到该挑战回调后,调用confirmSignIn()接口提交挑战应答,同时再次传入包含OTP渠道标识的clientMetadata
    • 此时触发的Create Auth Challenge触发器即可正常读取clientMetadata中的渠道参数(sms/whatsapp),按需调用对应OTP服务发送验证码即可
  • Android端核心代码示例:
// 发起登录请求时传入OTP渠道参数
val signInOptions = SignInOptions.builder()
    .clientMetadata(mapOf("otp_channel" to "whatsapp"))
    .build()
Amplify.Auth.signIn(
    username = "user_phone_number",
    password = null,
    options = signInOptions,
    onSuccess = { signInResult ->
        if (signInResult.isSignedIn) {
            // 登录完成后的业务逻辑
        } else {
            // 收到渠道选择挑战后,提交确认并再次传入相同的clientMetadata
            val challengeResponse = mapOf("answer" to "CHANNEL_SELECTED")
            val confirmOptions = ConfirmSignInOptions.builder()
                .clientMetadata(mapOf("otp_channel" to "whatsapp"))
                .build()
            Amplify.Auth.confirmSignIn(
                challengeResponse = challengeResponse,
                options = confirmOptions,
                onSuccess = { /* 等待用户输入OTP后的后续验证流程 */ },
                onError = { error -> /* 错误处理 */ }
            )
        }
    },
    onError = { error -> /* 错误处理 */ }
)

方案2:借助Cognito自定义用户属性透传

  • 提前在Cognito用户池新增临时自定义属性,例如custom:tmp_otp_channel,给未认证用户开放该属性的写入权限
  • 发起signIn()请求前,先调用未认证态的用户属性更新接口,将需要的OTP渠道类型写入该临时属性
  • 自定义认证Lambda触发时,直接读取用户属性中的渠道值选择对应OTP服务,验证码发送完成后清空该临时属性即可
  • 该方案不需要调整现有CUSTOM_AUTH的挑战流逻辑,但需要修改用户池属性配置与权限规则。

方案3:网络层注入自定义请求头(不推荐)

  • 可以通过给Amplify底层依赖的Cognito客户端添加OkHttp拦截器,在InitiateAuth、RespondToAuthChallenge请求中注入自定义请求头携带参数
  • 注意:Cognito默认不会将自定义请求头透传给Lambda触发器,需要额外搭配Lambda@Edge、API网关转发链路才能把请求头参数传到认证Lambda,配置复杂度高,后续维护成本大,非极端场景不要使用。

注意:不要直接修改Amplify Auth模块的源码注入参数,版本升级时会出现兼容性问题。

内容的提问来源于stack exchange,提问作者Rahul Rastogi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:24:20