Amplify Google登录时如何向预注册触发Lambda传递自定义属性
自定义属性传递方案
问题根因
你尝试通过customState传递参数但无法在preSignUp触发器中获取,是因为Cognito preSignUp触发器针对联邦身份(Google等第三方登录)的场景,设计上不会将OAuth授权流程中的state参数直接注入到事件参数中,仅用户名密码注册、自定义授权流场景支持直接在preSignUp中读取clientMetadata参数。
可行实现方案
方案1:调整触发器+透传customState
- 前端调用代码保持兼容写法,注意customState仅支持字符串类型,复杂数据需要序列化:
// 序列化自定义数据为字符串 const customData = JSON.stringify({ userId: 'xxx', source: 'web', inviteCode: 'xxx' }) Auth.federatedSignIn({ provider: 'Google', customState: customData }) - 放弃使用preSignUp触发器,改用Post Authentication触发器或者Pre Token Generation触发器,这两个触发器的事件参数中可以读取到你传递的customState,路径为
event.request.context["customState"],拿到参数后即可执行用户数据入库逻辑,逻辑和preSignUp完全一致,仅触发时机后置。
方案2:配合自定义用户属性传递
- 先在Cognito用户池的「属性」配置中添加自定义属性,比如
custom:invite_code、custom:source - 前端发起登录前先将自定义数据存入浏览器localStorage,用户完成Google登录回调到你的应用后,调用
Auth.updateUserAttributes()方法将自定义数据写入Cognito用户属性,同时触发你的入库逻辑,该方案不需要修改Lambda触发器配置,适合数据安全性要求不高的场景。
方案3:缓存临时数据映射
- 前端生成唯一的32位随机字符串作为stateKey,将自定义数据存入你的后端缓存(如Redis),过期时间设置为15分钟
- 将stateKey作为customState传递给
Auth.federatedSignIn - 触发preSignUp时,通过Lambda调用你的后端接口,传入用户的Google OpenID作为key查询对应的缓存自定义数据,完成入库后删除缓存即可。
内容的提问来源于stack exchange,提问作者ajay gupta
相关产品推荐
相关产品推荐

