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

如何在NodeJS后端通过AWSELBAuthSessionCookie获取Cognito用户信息?

从ALB的AWSELBAuthSessionCookie获取Cognito用户信息

当你的Node.js后端拿到ALB设置的AWSELBAuthSessionCookie后,可以通过以下步骤提取Cognito用户信息:

1. 提取并解码Cookie中的JWT

AWSELBAuthSessionCookie的值是URL编码的,且包含两个分号分隔的部分,第一部分就是ALB转发的JWT令牌。先从请求中提取这个Cookie,解码后拆分出JWT:

const cookieParser = require('cookie-parser');
const express = require('express');
const app = express();

// 用cookie-parser解析请求Cookie
app.use(cookieParser());

app.get('/api/get-user', async (req, res) => {
  // 提取认证Cookie
  const authCookie = req.cookies.AWSELBAuthSessionCookie;
  if (!authCookie) {
    return res.status(401).json({ error: '未通过认证' });
  }

  // URL解码Cookie值,拆分出JWT部分
  const decodedCookie = decodeURIComponent(authCookie);
  const jwtToken = decodedCookie.split(';')[0];
});

2. 验证JWT合法性并解码

不能直接信任解码后的JWT,必须用AWS ALB的公钥验证签名,确保令牌合法。JWT的Header中包含kid字段,用来获取对应的公钥:

const jwt = require('jsonwebtoken');
const axios = require('axios');

// 封装验证和解码JWT的函数
async function validateAndDecodeJwt(token) {
  try {
    // 解码JWT Header获取kid
    const headerBase64 = token.split('.')[0];
    const header = JSON.parse(Buffer.from(headerBase64, 'base64').toString());
    const kid = header.kid;
    const awsRegion = 'us-east-1'; // 替换成你的AWS区域

    // 从AWS获取对应公钥
    const publicKeyUrl = `https://public-keys.auth.elb.${awsRegion}.amazonaws.com/${kid}`;
    const publicKeyRes = await axios.get(publicKeyUrl);
    const publicKey = publicKeyRes.data;

    // 验证JWT签名并解码Payload
    const decodedPayload = jwt.verify(token, publicKey, { algorithms: ['ES256'] });
    return decodedPayload;
  } catch (err) {
    throw new Error(`JWT验证失败: ${err.message}`);
  }
}

3. 提取用户信息

解码后的JWT Payload中包含Cognito用户池的用户属性,直接提取需要的字段即可:

app.get('/api/get-user', async (req, res) => {
  try {
    const authCookie = req.cookies.AWSELBAuthSessionCookie;
    if (!authCookie) {
      return res.status(401).json({ error: '未通过认证' });
    }

    const decodedCookie = decodeURIComponent(authCookie);
    const jwtToken = decodedCookie.split(';')[0];

    // 验证并解码JWT
    const userPayload = await validateAndDecodeJwt(jwtToken);

    // 提取所需用户信息
    const userInfo = {
      姓名: userPayload.name,
      邮箱: userPayload.email,
      用户名: userPayload['cognito:username'],
      用户ID: userPayload.sub
    };

    res.json(userInfo);
  } catch (err) {
    res.status(401).json({ error: err.message });
  }
});

关键注意事项

  • 缓存公钥:不要每次请求都去AWS下载公钥,建议用内存缓存或Redis缓存公钥,减少网络请求开销。
  • 区域替换:务必将代码中的awsRegion替换为你实际使用的AWS区域(比如ap-southeast-1)。
  • 错误处理:针对Cookie缺失、JWT验证失败等情况返回合适的HTTP 401状态码,避免泄露敏感信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:00:53