首页 > 解决方案 > AWS Amplify currentAuthenticatedUser 在 React Native 中 FB 登录后为空,但是当重新加载应用程序时,currentAuthenticatedUser 返回有效用户

问题描述

我正在尝试将 Facebook 登录集成到我的 React Native 应用程序中。

我已经能够成功实现 Auth.signIn() 方法,并且我可以使用 Auth.currentAuthenticatedUser() 始终如一地检索用户。

但是,当我从 Facebook 登录获取代码后使用 Auth.currentAuthenticatedUser() 时,它返回 null。

更重要的是,当我重新加载应用程序时, Auth.currentAuthenticatedUser() 按预期返回用户。

我不明白为什么在我使用令牌创建用户会话后,它无法识别我有一个经过身份验证的用户。

这是我的代码:

getTokenbyCode = async (code) => {
      const details = {
        grant_type: 'authorization_code',
        code,
        client_id: userPool.clientId,
        redirect_uri: AuthSession.getRedirectUrl()
      }
      const formBody = Object.keys(details)
        .map(
          key => `${encodeURIComponent(key)}=${encodeURIComponent(details[key])}`
        )
        .join("&");

      await fetch(
        tokenURL,
        {
          method: "POST",
          headers: {
            'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
          },
          body: formBody
        }
      )
        .then(async (res) => {
          let tokenRequestJson = await res.json();
          const IdToken = new CognitoIdToken({ IdToken: tokenRequestJson.id_token });
          const AccessToken = new CognitoAccessToken({ AccessToken: tokenRequestJson.access_token });
          const RefreshToken = new CognitoRefreshToken({ RefreshToken: tokenRequestJson.refresh_token })
          try {
            let userSession = new CognitoUserSession({ IdToken, AccessToken, RefreshToken });
            const userData = {
              Username: userSession.idToken.payload.email,
              Pool: userPool
            };

            cognitoUser = new CognitoUser(userData);
            cognitoUser.setSignInUserSession(userSession);
            cognitoUser.getSession(async (err, session) => { // You must run this to verify that session (internally)
              if (session.isValid()) {

                // EVERYTHING WORKS UP TO HERE <!---------------->

                let cognitoUser = await Auth.currentAuthenticatedUser()
                this.setState({user: cognitoUser})

                this.props.navigation.navigate('AuthLoading', {user: cognitoUser})
              } else {
                console.log('session is not valid: ', session);
              }
            })
          }
          catch (FBSignInError) {
            console.log('FBSignInError: ', FBSignInError)
          }
        })
        .catch(error => {
          console.log('error: ', error);
        });
    }

标签: react-nativeamazon-cognitoaws-amplify

解决方案


我发现了这一点,但只是通过蛮力,所以如果有人想告诉我为什么会这样,我会很高兴听到它。

我的猜测是,通过使用 Auth 模块设置用户会话,它将用户令牌存储在正确的位置,以便 Auth.currentAuthenticatedUser 可以获取它。

  cognitoUser = new CognitoUser(userData);
  cognitoUser.setSignInUserSession(userSession);
  let authUser = Auth.createCognitoUser(cognitoUser.getUsername())
  authUser.setSignInUserSession(userSession)

创建 cognitoUser 可能不是必需的,但它正在工作,所以我很擅长。


推荐阅读