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

如何处理Google身份提供商的AWS Cognito响应并创建自动令牌会话?

处理Google身份提供商的AWS Cognito响应与会话管理

看起来你已经走完了Google和Cognito集成的最麻烦部分——配置和重定向,接下来就是把返回的AccessToken、IdToken等参数利用起来,让你的JS应用无缝对接Cognito会话管理,实现令牌的自动发送、续期。下面分步骤给你讲清楚怎么做:

第一步:解析Google重定向后的Cognito响应参数

首先你需要从回调URL的查询参数里提取Cognito返回的令牌信息,用原生JS的URLSearchParams就能轻松搞定:

// 从当前URL提取查询参数
const urlParams = new URLSearchParams(window.location.search);

// 提取Cognito返回的令牌和参数
const tokens = {
  AccessToken: urlParams.get('AccessToken'),
  IdToken: urlParams.get('IdToken'),
  ExpiresIn: parseInt(urlParams.get('ExpiresIn'), 10),
  TokenType: urlParams.get('TokenType'),
  // 如果配置了刷新令牌,也会返回RefreshToken
  RefreshToken: urlParams.get('RefreshToken')
};

// 提取完后清理URL里的参数,避免重复处理
window.history.replaceState({}, document.title, window.location.pathname);

第二步:用AWS Amplify快速实现会话管理(推荐方案)

手动处理令牌存储、续期和API授权会非常繁琐,AWS Amplify已经封装了所有这些逻辑,是最省心的选择。

1. 配置Amplify

先确保你已经安装了Amplify依赖,并配置好用户池信息(可以通过amplify init生成aws-exports.js,或者手动创建配置):

import { Amplify, Auth } from 'aws-amplify';

Amplify.configure({
  Auth: {
    region: '你的Cognito用户池区域',
    userPoolId: '你的Cognito用户池ID',
    userPoolWebClientId: '你的Cognito应用客户端ID',
    oauth: {
      domain: '你的Cognito域名',
      redirectSignIn: '你的回调URL',
      redirectSignOut: '你的登出回调URL',
      responseType: 'token' // 对应你当前的授权流程,返回令牌
    }
  }
});

2. 初始化Cognito会话

拿到令牌后,手动创建CognitoUserSession并关联到当前用户,让Amplify接管会话管理:

import { CognitoUserSession, CognitoIdToken, CognitoAccessToken, CognitoRefreshToken } from 'aws-amplify';

// 创建令牌对象
const idTokenObj = new CognitoIdToken({ IdToken: tokens.IdToken });
const accessTokenObj = new CognitoAccessToken({ AccessToken: tokens.AccessToken });
const refreshTokenObj = tokens.RefreshToken ? new CognitoRefreshToken({ RefreshToken: tokens.RefreshToken }) : null;

// 构建会话
const session = new CognitoUserSession({
  IdToken: idTokenObj,
  AccessToken: accessTokenObj,
  RefreshToken: refreshTokenObj
});

// 获取当前认证用户并设置会话
const user = await Auth.currentAuthenticatedUser({ bypassCache: true });
user.setSignInUserSession(session);

3. 自动发送令牌与续期

  • 自动授权API请求:使用Amplify的API模块(API.get/API.post等)发起请求时,Amplify会自动在请求头中添加Authorization: Bearer <IdToken>,无需手动处理。
  • 自动续期令牌:Amplify会实时监控令牌的过期时间,当AccessToken快过期时,自动用RefreshToken向Cognito请求新的令牌,整个过程完全透明,不需要你写额外代码。

第三步:手动处理会话管理(不使用Amplify)

如果不想依赖Amplify,也可以手动实现会话逻辑,但需要自己处理存储、过期检查和续期:

1. 存储令牌

把令牌和过期时间存在localStorage(注意:存在XSS风险,SPA场景下可配合XSS防护措施):

const storeTokens = (tokens) => {
  // 计算令牌过期的时间戳
  const expiresAt = Date.now() + tokens.ExpiresIn * 1000;
  localStorage.setItem('cognito_session', JSON.stringify({
    ...tokens,
    expiresAt
  }));
};

// 调用存储函数
storeTokens(tokens);

2. 自动添加授权头到API请求

封装一个带认证的fetch函数,每次请求前检查令牌是否过期,过期则刷新:

// 获取存储的令牌
const getStoredSession = () => {
  const sessionStr = localStorage.getItem('cognito_session');
  return sessionStr ? JSON.parse(sessionStr) : null;
};

// 检查令牌是否过期
const isSessionExpired = () => {
  const session = getStoredSession();
  return !session || Date.now() > session.expiresAt;
};

// 刷新令牌
const refreshSession = async () => {
  const session = getStoredSession();
  if (!session?.RefreshToken) throw new Error('无刷新令牌可用,需重新登录');

  // 使用AWS SDK v3调用Cognito的InitiateAuth接口
  import { CognitoIdentityProviderClient, InitiateAuthCommand } from "@aws-sdk/client-cognito-identity-provider";
  const client = new CognitoIdentityProviderClient({ region: '你的区域' });
  
  const command = new InitiateAuthCommand({
    AuthFlow: 'REFRESH_TOKEN_AUTH',
    ClientId: '你的应用客户端ID',
    AuthParameters: {
      REFRESH_TOKEN: session.RefreshToken
    }
  });

  const response = await client.send(command);
  // 更新存储的会话
  storeTokens({
    AccessToken: response.AuthenticationResult.AccessToken,
    IdToken: response.AuthenticationResult.IdToken,
    RefreshToken: response.AuthenticationResult.RefreshToken || session.RefreshToken,
    ExpiresIn: response.AuthenticationResult.ExpiresIn
  });
};

// 带认证的fetch封装
const authFetch = async (url, options = {}) => {
  if (isSessionExpired()) {
    await refreshSession();
  }
  const session = getStoredSession();
  const headers = {
    ...options.headers,
    Authorization: `Bearer ${session.IdToken}`
  };
  return fetch(url, { ...options, headers });
};

3. 注意事项

  • 刷新令牌默认有效期30天,可以在Cognito用户池的“应用客户端设置”里调整。
  • 若刷新令牌也过期了,需要引导用户重新登录。
  • 为了安全,建议在用户登出时清除localStorage里的会话信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:58