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

NodeJS后端无Amplify实现Google与Cognito身份认证对接

我在查找无需Amplify、通过后端处理Google回调redirectUri的code来完成Google用户与Cognito用户池应用客户端认证的文档或示例时遇到问题。当前流程为:前端点击Google登录按钮,选择邮箱后重定向至Express后端的/google/callback路由,该路由代码如下:

// google callback redirect uri express route
router.get('/google/callback', function(req, res, next) {
  const { code } = req.query as string;
  const { tokens } = await googleAuthClient.getToken(req.query.code);
  const idToken = tokens.id_token;

  const ticket = await googleClient.verifyIdToken({
      idToken: idToken,
      audience: GOOGLE_CLIENT_ID 
  });
  const payload = ticket.getPayload();
  const userid = payload['sub'];

我已通过该代码获取Google的idToken并验证,拿到用户信息。尝试使用AWS SDK的CognitoIdentityServiceProvider调用initiateAuth,测试不同AUTH_FLOW但未成功,因用户通过Google登录无密码,不清楚应使用哪种AUTH_FLOW及所需参数。我希望不使用前端Amplify和Cognito托管UI,仅通过后端完成认证。已知Google账号已与Cognito账号关联,请问如何利用现有流程中的信息完成Cognito认证并获取accessToken?

解决方案

你需要使用CognitoIdentityServiceProvider的initiateAuth方法,选择CUSTOM_AUTH作为认证流程,结合已获取的Google idToken完成认证,具体步骤如下:

核心配置与参数说明

  • AuthFlow: 指定为CUSTOM_AUTH,该流程支持自定义凭证验证,适配第三方IDP的token认证场景
  • AuthParameters: 需传递两个关键参数:
    • USERNAME: Cognito用户池中的用户名(可使用关联的Google邮箱,前提是Cognito用户的用户名设置为邮箱)
    • GOOGLE_ID_TOKEN: 你已从Google获取并验证的idToken
  • ClientId: 你的Cognito用户池应用客户端ID

完整代码示例

在你的Express回调路由中补充Cognito认证逻辑:

const { CognitoIdentityServiceProvider } = require('@aws-sdk/client-cognito-identity-provider');

// 初始化Cognito客户端
const cognitoClient = new CognitoIdentityServiceProvider({
  region: '你的AWS区域(如us-east-1)'
});

router.get('/google/callback', async function(req, res, next) {
  // 原有Google认证逻辑
  const { code } = req.query;
  const { tokens } = await googleAuthClient.getToken(code);
  const idToken = tokens.id_token;

  const ticket = await googleClient.verifyIdToken({
    idToken: idToken,
    audience: GOOGLE_CLIENT_ID 
  });
  const payload = ticket.getPayload();
  const userEmail = payload['email']; // 假设Cognito用户用户名关联邮箱

  // Cognito认证逻辑
  try {
    const authResponse = await cognitoClient.initiateAuth({
      ClientId: '你的Cognito应用客户端ID',
      AuthFlow: 'CUSTOM_AUTH',
      AuthParameters: {
        USERNAME: userEmail,
        GOOGLE_ID_TOKEN: idToken
      }
    });

    // 提取并返回Cognito认证凭证
    const { AccessToken, IdToken, RefreshToken } = authResponse.AuthenticationResult;
    res.json({
      accessToken: AccessToken,
      idToken: IdToken,
      refreshToken: RefreshToken
    });
  } catch (err) {
    console.error('Cognito认证失败:', err);
    res.status(500).json({ error: '认证失败,请检查配置' });
  }
});

注意事项

  • 若你的Cognito应用客户端启用了客户端密钥,需在initiateAuth参数中添加SecretHash,计算方式为:用HMAC-SHA256哈希USERNAME + ClientId,密钥为客户端密钥
  • 若后端具备管理员权限,也可使用adminInitiateAuth方法,此时需添加UserPoolId参数,且无需传递SecretHash
  • 确保Google身份提供商已正确配置到Cognito用户池,且当前Google账号已与Cognito用户完成关联

内容的提问来源于stack exchange,提问作者user6680

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:05:42