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

