AWS Amplify currentAuthenticatedUser имеет значение NULL после входа в FB в React Native, но при перезагрузке приложения currentAuthenticatedUser возвращает действительного пользователя - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь интегрировать логин Facebook в свое приложение React Native.

Мне удалось успешно реализовать метод Auth.signIn (), и я могу последовательно извлекать пользователя, используя Auth.currentAuthenticatedUser ().

Однако, когда я использую Auth.currentAuthenticatedUser () после получения кода от входа в Facebook, он возвращает ноль.

Более того, когда я перезагружаю приложение, 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);
        });
    }

1 Ответ

0 голосов
/ 04 апреля 2019

Я понял это, но только грубой силой, поэтому, если кто-то захочет сказать мне, ПОЧЕМУ это работает, я буду рад это услышать.

Я предполагаю, что установив сеанс пользователя, используяМодуль Auth, он хранит пользовательские токены в нужном месте, так что Auth.currentAuthenticatedUser может его забрать.

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

Создание cognitoUser может быть необязательным, но он работает, поэтому я хорошоэто.

...