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

基于AWS Amplify V1自定义UI实现Cognito登录返回code方案咨询

实现Cognito登录并返回Authorization 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流程):

  1. 自定义认证流程:

    • 在Cognito用户池的「认证触发器」中配置PostAuthentication Lambda函数
    • 用户通过自定义UI提交用户名密码后,前端调用Auth.signIn()或initiateAuth(USER_PASSWORD_AUTH)获取令牌
    • 在Lambda触发器中,生成唯一的授权码(如UUID),将其与用户ID、过期时间关联存储到数据库(如DynamoDB)
    • 将生成的code通过认证结果返回给前端
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:25:06