基于AWS Amplify V1自定义UI实现Cognito登录返回code方案咨询
首先明确:你当前使用的USER_PASSWORD_AUTH认证流属于AWS原生的用户密码认证,不会返回OAuth 2.0的Authorization Code——因为该流程直接返回访问令牌,不属于授权码流程的范畴。要获取code,必须基于Cognito的OAuth 2.0授权码流程来调整实现。
核心前提:配置Cognito用户池客户端
先确保你的Cognito用户池客户端已正确配置OAuth授权码流程:
- 进入AWS控制台的Cognito用户池,找到对应应用客户端
- 开启「OAuth」功能,勾选「Authorization code grant」授权类型
- 配置合法的「回调URL」和「注销URL」(需与前端/后端的实际地址匹配)
- 勾选必要的OAuth范围(如
openid、email) - 记录用户池域名、客户端ID等信息
方案选择(根据你的自定义UI需求)
方案1:使用Cognito托管UI(快速实现,但需跳转)
如果可以接受临时跳转到Cognito的托管授权页面,直接通过Amplify配置OAuth参数即可:
// Amplify v1 配置 import Amplify from 'aws-amplify'; import Auth from '@aws-amplify/auth'; Amplify.configure({ Auth: { userPoolId: '你的用户池ID', userPoolWebClientId: '你的客户端ID', oauth: { domain: '你的Cognito用户池域名(如xxx.auth.region.amazoncognito.com)', scope: ['openid', 'email'], redirectSignIn: '你的回调URL(如https://yourapp.com/callback)', redirectSignOut: '你的注销URL', responseType: 'code' // 指定返回code } } }); // 触发登录(会跳转到Cognito托管UI) Auth.signIn() .then(user => console.log(user)) .catch(err => console.log(err));
跳转后,Cognito会在回调URL中携带code参数,你可以在回调页面中提取该参数,再调用Cognito的token端点换取令牌。
方案2:保留自定义UI(需自定义开发)
如果必须完全使用自己的登录UI,且不想跳转Cognito页面,需要通过自定义Lambda触发器实现类似授权码的逻辑(适合内部信任应用,非标准OAuth流程):
自定义认证流程:
- 在Cognito用户池的「认证触发器」中配置
PostAuthenticationLambda函数 - 用户通过自定义UI提交用户名密码后,前端调用
Auth.signIn()或initiateAuth(USER_PASSWORD_AUTH)获取令牌 - 在Lambda触发器中,生成唯一的授权码(如UUID),将其与用户ID、过期时间关联存储到数据库(如DynamoDB)
- 将生成的
code通过认证结果返回给前端
- 在Cognito用户池的「认证触发器」中配置
用code换取令牌:
- 前端拿到
code后,调用你的后端接口 - 后端验证
code的有效性(查询数据库,检查是否存在、未过期) - 验证通过后,使用Cognito的
adminInitiateAuth接口获取用户令牌,返回给前端
- 前端拿到
示例Lambda触发器代码(PostAuthentication):
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB.DocumentClient(); const { v4: uuidv4 } = require('uuid'); exports.handler = async (event) => { // 生成授权码 const code = uuidv4(); // 存储code到DynamoDB,设置10分钟过期 await dynamodb.put({ TableName: 'CognitoAuthCodes', Item: { code: code, userId: event.request.userAttributes.sub, expiresAt: Date.now() + 600000 } }).promise(); // 将code添加到认证结果中返回给前端 event.response.claimsOverrideDetails = { claimsToAddOrOverride: { auth_code: code } }; return event; };
为什么你的原有代码无法返回code
USER_PASSWORD_AUTH是Cognito的直接认证流,设计目的是快速返回用户令牌,跳过OAuth授权码的中间环节。该流程不涉及OAuth授权端点,因此不会生成或返回Authorization Code。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

