aws-amplify auth currentSession 不返回当前用户

Posted

技术标签:

【中文标题】aws-amplify auth currentSession 不返回当前用户【英文标题】:aws-amplify auth currentSession returns no current user 【发布时间】:2019-05-06 21:44:15 【问题描述】:

使用:Nodejs + aws-amplify

来自aws amplify documentation,但是登录后我没有成功检查用户。

index.js

const Amplify = require('aws-amplify');
global.fetch = require('node-fetch'); // [source](https://github.com/aws-amplify/amplify-js/issues/876)
global.navigator = ;

Amplify.default.Auth(
    identityPoolId: IDENTITYPOOLID,
    region: REGION,
    userPoolId: USERPOOLID,
    userPoolWebClientId: APPCLIENTID,
);

Amplify.Auth.signIn(username, password).then(user => 
    localstorage.set('user', JSON.stringify(user));
    console.log(user); // "cognitoUser" object
    return Amplify.Auth.getSession();
).then(session => 
    console.log(session); // "CognitoSession" object
).catch(err => 
    console.log(err);
);

// PROBLEM
Amplify.Auth.getSession().then(session => 
    console.log(session);
).catch(err => 
    console.log(err); // PRINT: no current user
);

看起来我无法获取用户会话,除非它包含在 Auth.signIn 中。我试过用;

// Problem
let userObj = JSON.parse(localstorage.get('use'));
Amplify.Auth.userSession(userObj).then(data => 
    console.log(data);
);
/// getSession is not a function

console.log(Amplfy.Auth.userSession); // PRINT: [Function]

我可以验证 userSession 是函数并且在库中,我看到的问题是getSession() 不在我存储在本地存储中的 CognitoUser 对象中。

如果这是问题所在,我找不到任何可以帮助我将 localstorage 对象转换为 CognitoObj 的函数。我唯一能做的就是每次都签署用户,这忽略了这个库的全部目的。

我错过了什么吗?为什么Amplify.Auth 不起作用?有没有办法检查任一用户的会话是否过期并手动刷新它?

我有与github 类似的问题。

【问题讨论】:

【参考方案1】:

看起来我无法获取用户会话,除非它包含在 Auth.signIn 中

简而言之,这就是 Node/JS 异步编程模型。如果您在异步操作之间有一些时间依赖性,则必须将后面的操作包装在回调或 then 中,和/或相反地将早期的操作包装在 awaited 承诺中。

事实上,如果你有一些可以并发运行的异步操作/相互之间没有依赖关系,你可以用Promise.all API优化你的代码,让它同时发送所有异步请求,并在最后一个完成。

Top-level await 可能会帮助解决这样的用例。

【讨论】:

【参考方案2】:

我也遇到了同样的问题,最后写成这样。

import Auth from "@aws-amplify/auth";
Auth.currentAuthenticatedUser().then((user) => 
  const session = user.getSignInUserSession();
  if (session) 
    AWS.config.credentials = new AWS.CognitoIdentityCredentials(
      IdentityPoolId: "REGION:POOL_ID",
      Logins: 
        "cognito-idp.REGION.amazonaws.com/ID": session
          .getIdToken()
          .getJwtToken(),
      ,
    );
  
);

【讨论】:

以上是关于aws-amplify auth currentSession 不返回当前用户的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify 错误从 aws-amplify 导入 StorageProvider 类

为啥我的 AWS-Amplify 注册请求不包含某些参数?

无法使用 aws-amplify 从 cognito 获取更新的属性及其值

尝试将我的“aws-amplify”包导入我的入口点时收到 JSLint 错误

如何使用 aws-amplify 处理 api 错误?

aws-amplify-react 和 @aws-amplify/ui-react 有啥区别?