如何从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
相关产品推荐
相关产品推荐

