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

时间:2018-12-05 10:36:34

标签: node.js session authentication aws-amplify

使用: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是函数并且在lib内部,而我看到的问题是getSession()不在我存储在localstorage中的CognitoUser对象内部。

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

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

我对github有类似的问题。

2 个答案:

答案 0 :(得分:0)

  

除非我将其包装在Auth.signIn中,否则我似乎无法获得用户会话

简而言之,这就是Node / JS异步编程模型。如果您在异步操作之间存在某种时间依赖性,则必须将后面的操作包装在回调或then中,和/或反之,将之前的操作包装在await承诺中。

实际上,如果您有一些可以同时运行的异步操作/彼此之间没有依赖关系,则可以使用Promise.all API优化代码,以便它同时发送所有异步请求并解决当最后一个完成时。

Top-level await可能会帮助解决此类用例。

答案 1 :(得分:0)

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

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(),
      },
    });
  }
});