Node.js后端使用AWS SDK对接Amazon Cognito登录实现问题咨询
我是AWS服务开发初学者,相关知识储备有限,虽已尽力查阅官方文档,但部分内容对新手而言理解门槛较高,或存在内容缺漏,若有疏漏敬请谅解。
当前项目架构为:React前端负责采集用户输入数据,将数据传输至Node.js后端,由后端通过AWS SDK与Amazon Cognito用户池交互完成认证逻辑。
已完成的开发工作
目前已基于Cognito以下API动作完成了用户注册、注册确认、重发确认码的路由配置:
signUpconfirmSignUpresendConfirmationCode
待解决的疑问
暂未查询到覆盖基础登录、MFA认证等全流程场景的登录相关API动作。官方文档提及了Cognito托管UI方案,但需求为所有认证请求都流转至自有后端,由后端统一处理完整认证流程,需要确认遗漏的相关配置或API。
你当前使用的注册类API都属于Cognito用户池的身份提供者服务客户端,登录全流程相关API也在同一客户端包内,不需要依赖托管UI即可完成自有后端的全链路认证逻辑,具体遗漏的API和配置如下:
核心登录流程相关API
所有登录流程的入口API为initiateAuth,所有挑战类验证(含MFA、强制改密等)的提交API为respondToAuthChallenge,不同场景的调用逻辑:
- 基础无MFA登录:调用
initiateAuth时指定认证流为USER_PASSWORD_AUTH,传入用户名、密码参数,认证通过后会直接返回ID令牌、访问令牌、刷新令牌三类凭证。 - MFA认证场景:调用
initiateAuth后如果返回结果中ChallengeName字段为SMS_MFA(短信MFA)或SOFTWARE_TOKEN_MFA(TOTP虚拟MFA),说明触发了MFA校验,将返回的会话标识、用户输入的MFA验证码作为参数传入respondToAuthChallenge即可完成校验,校验通过后返回用户凭证。 - 其他登录挑战场景:首次登录强制改密、新设备验证、MFA设备绑定等场景,同样通过
initiateAuth触发挑战、respondToAuthChallenge提交对应验证参数完成流程,不同挑战需要的参数可直接参考SDK内置的类型定义。
配套常用认证API
后续开发完整认证流程还会用到以下API:
forgotPassword:发起忘记密码流程,向用户发送密码重置验证码confirmForgotPassword:校验重置验证码,完成新密码设置changePassword:用户已登录状态下修改密码associateSoftwareToken:绑定TOTP虚拟MFA设备时生成绑定密钥verifySoftwareToken:校验用户输入的TOTP验证码,完成MFA设备绑定setUserMFAPreference:配置用户的MFA使用偏好(如选择短信MFA或TOTP MFA)
必须补充的Cognito控制台配置
仅集成API会出现调用报错,需要提前在Cognito用户池控制台完成以下配置:
- 进入对应用户池的「应用客户端」配置页,找到你后端调用使用的应用客户端,在认证流配置中开启
ALLOW_USER_PASSWORD_AUTH权限,默认新建客户端不会开启该密码认证流,会直接导致initiateAuth调用失败。 - 进入用户池「多因素认证」配置页,开启需要支持的MFA方式(短信、TOTP),可根据业务需求配置为「强制开启」或「用户可选」,未开启时不会触发对应MFA挑战流程。
- 所有AWS SDK调用均放在Node后端实现,不要将SDK访问密钥、Cognito客户端敏感配置暴露在React前端代码中,前端仅与自有后端接口通信即可。
注:如果你使用的是AWS SDK v3版本,所有上述API均从
@aws-sdk/client-cognito-identity-provider包导入;如果使用SDK v2版本,上述方法挂载在AWS.CognitoIdentityServiceProvider实例下,方法名保持一致。
内容的提问来源于stack exchange,提问作者arengit

