无法从Amazon Cognito用户池获取用户会话

时间:2018-07-13 21:26:44

标签: javascript reactjs amazon-web-services aws-cognito aws-amplify

我正在使用Amazon的Cognito用户池来发起SAML SSO身份验证。我正在使用aws-amplify,它是一个JavaScript库,用于使用云服务和ReactJS进行前端的应用程序开发。尝试使用currentSession()函数似乎存在一些问题。使用软件包的Auth模块的Auth.siginIn()函数时,我的会话似乎没有保存该会话。我已经测试并成功登录了我在用户池中设置的当前测试用户。我想使用Auth.currentSession()函数的原因是为了验证应用程序中每个视图的会话。在下面,您可以看到在用户验证登录名后,我将其发送到仪表板视图,然后在组件装入后尝试验证会话,但它返回未找到用户的错误。以下是我使用的代码。我查看了aws-amplify网站上的文档,但似乎无法找出问题所在。

  

注意:Redux用于存储来自setUserData和setAuthToken(会话   登录后回复)

Login.js

  handleSubmit = (event) => {
    event.preventDefault();
    Auth.signIn(this.state.sso, this.state.password)
    .then((res) => {
      this.props.authUser(true)
      this.props.setUserData(res.username)
      this.props.setAuthToken(res.Session)
    })
    .then(() => {
      this.props.history.push("/Dashboard")
    })
    //catches err
    .catch((e) => {
      console.log(e);
      alert(e.message)
      this.props.authUser(false)
    })
  }

用户登录后,应将其推送到仪表板。在组件生命周期中调用componentDidMount()之后,我想检查当前会话以查看是否仍在会话中。

Dashboard.js

componentDidMount(){
    debugger;
    console.log(Auth);
    Auth.currentSession().then((res) => {
      console.log(res);
    }).catch((e) => {
      alert(e)
    })


    this.props.toggleError(false);
    this.props.toggleNotify()
  }

1 个答案:

答案 0 :(得分:1)

SAML的身份验证流程与在UserPool中创建的用户不同。 Auth.signIn()仅用于认证在用户池中创建的用户。 (AWS Amplify Documentation

要启动SAML身份验证流程,请按照以下步骤操作:

  1. 在UserPool中将SAML提供程序设置为联合身份
  2. 将用户定向到您的AWS UserPool托管的SAML SSO页面。
  3. 用户将通过SAML SSO提供程序进行身份验证,而您的 UserPool 将向您的应用程序发送JWT
  4. 使用AWS-Amplify Auth.federatedSignIn()方法接收AWS IAM凭据(将由AWS-Amlify管理

该指南是第1-3步的实用资源:Amazon Cognito User Pools supports federation with SAML

对于第4步:

Auth.federatedSignIn(
    // Initiate federated sign-in with your User Pool  
    'cognito-idp.us-west-2.amazonaws.com/us-west-2_XXXXXXXXX',
    { 
        // the JWT token parsed from the response url
        token: #id_token
    },
    // (optional) a user object (a simple dictionary created from the #access_token)
    user
).then(() => {
    // ...
});