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

基于Cognito的令牌登录咨询:如何实现登录及API调用授权?

方案可行性与实现步骤

核心结论

这种通过已存储的refresh token获取新令牌并完成登录的方案完全可行,属于Cognito标准令牌生命周期管理的合理延伸,需要同时处理前端登录状态同步和API请求授权两个环节,不能只靠API携带令牌。


一、后端Lambda获取新令牌的正确方式

调用adminInitiateAuth时必须指定正确的认证流程和参数,Node.js示例代码:

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider();

async function refreshTokens(userEmail, storedRefreshToken) {
  const params = {
    AuthFlow: 'REFRESH_TOKEN_AUTH', // 固定使用该流程刷新令牌
    ClientId: '你的Cognito客户端ID',
    UserPoolId: '你的Cognito用户池ID',
    AuthParameters: {
      USERNAME: userEmail, // Cognito用户名需与邮箱一致,或提前完成映射
      REFRESH_TOKEN: storedRefreshToken
      // 若用户池开启设备跟踪,需额外传入之前存储的DEVICE_KEY
    }
  };

  const result = await cognito.adminInitiateAuth(params).promise();
  // Cognito可能返回新的refresh token,建议同步更新RDS中的存储
  return {
    accessToken: result.AuthenticationResult.AccessToken,
    idToken: result.AuthenticationResult.IdToken,
    newRefreshToken: result.AuthenticationResult.RefreshToken || storedRefreshToken
  };
}
  • 权限要求:Lambda执行角色需附加包含cognito-idp:AdminInitiateAuth动作的IAM策略,且限定到目标用户池。

二、完成Cognito前端登录状态同步

仅拿到新令牌不算完成“登录”,需要让前端认证状态与Cognito同步:

  • 若使用Amplify SDK:
    调用Auth.federatedSignIn注入令牌并设置过期时间:
    import { Auth } from 'aws-amplify';
    
    async function syncCognitoSession(idToken, accessToken, refreshToken, expiresAt) {
      await Auth.federatedSignIn({
        token: idToken,
        expires_at: expiresAt,
        user: {
          username: '用户邮箱',
          signInUserSession: {
            accessToken: { jwtToken: accessToken },
            idToken: { jwtToken: idToken },
            refreshToken: { token: refreshToken }
          }
        }
      });
    }
    
  • 若为自定义前端:
    手动将AccessToken、IdToken、RefreshToken存储到localStorage/sessionStorage,同时维护过期时间戳,前端业务逻辑通过读取这些值判断登录状态。

三、API调用的授权处理

每次请求受Cognito保护的API Gateway时,必须在请求头中携带令牌:

  • 在请求头添加Authorization: Bearer <IdToken>或Authorization: Bearer <AccessToken>(两种都可通过Cognito User Pool认证,IdToken包含用户身份信息,AccessToken更侧重权限校验)。
  • 但仅做这一步的话,前端的登录状态(如页面导航权限、用户信息展示)无法生效,必须同步完成前端状态维护。

关键注意事项

  • refresh token安全性:RDS存储refresh token时必须加密,避免明文泄露导致账户被冒用。
  • 令牌过期处理:监听IdToken和AccessToken的过期时间,提前触发刷新流程,避免用户操作时出现权限错误。
  • 设备跟踪:如果用户池开启了设备跟踪,需在存储refresh token的同时保存DEVICE_KEY,刷新时传入参数,否则可能触发额外的认证挑战。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:10:24