Получение пользователя AWS Cognito из идентификатора токена, полученного из конечной точки токена - PullRequest
0 голосов
/ 07 марта 2019

Я создаю приложение React Native, используя Expo и AWS Cognito с AWS Amplify, и пытаюсь включить вход в Facebook, Google и т. Д. С помощью AWS

Я могу создать пользователя и войти в систему с помощью API Cognito без каких-либо проблем.

Однако для использования сторонних производителей необходимо использовать функциональность Expo AuthSession.

Функциональность сама по себе работает нормально, и я могу полностью получить нужные токены из моей конечной точки / oauth2 / token.

Однако, что касается Amplify (и я знаю), пользователь не вошел в систему, поэтому, когда я пытаюсь получить Auth.currentAuthenticatedUser (), возвращается значение null.

  // Open URL in a browser
  openURL = async (url) => {
    let result = await AuthSession.startAsync({ authUrl: url })
    this.getTokenbyCode(result.params.code)
  };

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

    await fetch(
      'https://presentor.auth.us-west-2.amazoncognito.com/oauth2/token',
      {
        method: "POST",
        headers: {
          'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
        },
        body: formBody
      }
    )
      .then(async (res) => {
        console.log('res: ', res);
        let resJSON = await res.json();
        let idToken = await resJSON.id_token;
        let decodedToken = jwt(idToken);
        let userData = {
            Username : decodedToken["cognito:username"],
            Pool : Auth.userPool
        }
      })
      .catch(error => {
        console.log('error: ', error);
      });
  }

Когда я декодирую токен, я вижу полезную нагрузку, как я ожидаю, но если я хочу, например, использовать API-интерфейсы для обновления токена, если срок его действия истекает, я должен обойти его вручную (проверить срок действия и получить новый токен, если срок его действия истек).

Я что-то упустил?

1 Ответ

0 голосов
/ 07 марта 2019

Хорошо, я понял это. Не уверен, что это правильный путь, но он довольно чистый и работает, так что я в порядке.

  1. Создание объектов CognitoIdToken, CognitoAccessToken и CognitoRefreshToken с использованием amazon-cognito-identity-js
  2. Создать сеанс пользователя из этих токенов
  3. Создать пользователя из этого сеанса пользователя

    await fetch(
      'TOKEN ENDPOINT',
      {
        method: "POST",
        headers: {
          'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
        },
        body: formBody
      }
    )
      .then(async (res) => {
        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 });
          console.log('userSession: ', userSession);
          const userData = {
            Username: userSession.idToken.payload.email,
            Pool: userPool
          };
          console.log('userData: ', userData);
          cognitoUser = new CognitoUser(userData);
          cognitoUser.setSignInUserSession(userSession);
          cognitoUser.getSession((err, session) => { // You must run this to verify that session (internally)
            if (session.isValid()) {
              console.log('session is valid');
              this.setState({user: cognitoUser})
              this.props.navigation.navigate('AuthLoading')
            } else {
              console.log('session is not valid: ', session);
            }
          })
        }
        catch (FBSignInError) {
          console.log('FBSignInError: ', FBSignInError)
        }
      })
      .catch(fetchError => console.log('fetchError: ', fetchError))
    
...