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

如何从AWS Cognito获取token并在success回调函数外使用accessToken

问题核心原因

你现在拿不到token是两个核心原因:

  • authenticateUser 是异步方法,你在回调外部同步访问时,onSuccess 还没触发,token还没生成
  • 你当前的accessToken是onSuccess回调里的局部变量,作用域仅限回调内部,外部本来就无法直接访问
解决方案

方案1:用Promise封装异步逻辑(推荐)

把认证过程包成Promise,后续通过.then或者async/await获取token,这是最符合JS异步规范的写法:

// 封装认证方法返回Promise
function authenticateUser() {
  var authenticationData = {
    Username : 'username',
    Password : 'password',
  };
  var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
  var poolData = { 
    UserPoolId : 'us-east-1_ExaMPle',
    ClientId : '1example23456789'
  };
  var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
  var userData = {
    Username : 'username',
    Pool : userPool
  };
  var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

  return new Promise((resolve, reject) => {
    cognitoUser.authenticateUser(authenticationDetails, {
      onSuccess: function (result) {
        const accessToken = result.getAccessToken().getJwtToken();
        const idToken = result.idToken.jwtToken;
        // 把需要的结果抛出去
        resolve({ accessToken, idToken });
      },
      onFailure: function(err) {
        reject(err);
      },
    });
  })
}

// 调用方式1:用.then链式调用
authenticateUser()
  .then(({accessToken, idToken}) => {
    // 这里就可以正常使用token了
    console.log('获取到的accessToken:', accessToken);
    // 后续业务逻辑写在这里
  })
  .catch(err => {
    alert(err);
  })

// 调用方式2:在async函数里用await(写法更简洁)
async function yourBusinessLogic() {
  try {
    const {accessToken, idToken} = await authenticateUser();
    // 这里可以正常使用token
    console.log(accessToken);
    // 你的业务代码
  } catch (err) {
    alert(err);
  }
}
// 执行业务方法
yourBusinessLogic();

方案2:存储到外部变量/缓存(适合简单场景)

如果是临时使用,也可以把token存到全局变量或者浏览器存储里,注意要等异步完成后再取:

// 提前在外部声明变量
let globalAccessToken = '';
let globalIdToken = '';

var authenticationData = {
  Username : 'username',
  Password : 'password',
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var poolData = { UserPoolId : 'us-east-1_ExaMPle',
  ClientId : '1example23456789'
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
var userData = {
  Username : 'username',
  Pool : userPool
};
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
  onSuccess: function (result) {
    // 赋值给外部变量,也可以存到sessionStorage:sessionStorage.setItem('accessToken', result.getAccessToken().getJwtToken())
    globalAccessToken = result.getAccessToken().getJwtToken();
    globalIdToken = result.idToken.jwtToken;
    // 这里调用需要用token的方法
    afterGetToken();
  },

  onFailure: function(err) {
    alert(err);
  },
});

function afterGetToken() {
  // 这里就可以拿到全局的token了
  console.log(globalAccessToken);
}
注意事项
  • 绝对不能在调用authenticateUser之后同步立即读取token,异步方法还没执行完成,拿到的只会是空值或者undefined
  • 敏感token不建议长期存在全局变量或者localStorage里,存在sessionStorage更安全,页面关闭后会自动清除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:00