регистрация в Facebook успешно выполняется без получения учетных данных пользователя - PullRequest
0 голосов
/ 11 июня 2019

Я создал систему аутентификации входа в Facebook в своем приложении RN.В процессе я использую следующие функции:

проверьте, существует ли токен, а если нет, то войдите в систему -

export const facebookLogin = () => async dispatch => {
  let token = await AsyncStorage.getItem('fb_token');
  console.log("got token", token);
  if (token) {
      dispatch({ type: FACEBOOK_LOGIN_SUCCESS, payload: token});
      console.log('facebook login success!');
  } else {
    doFacebookLogin(dispatch);
    console.log('need to login');
  }

doFacebookLogin должен вернуть токен из Facebook, а затем получитьUID из Firebase аутентификации, а затем зарегистрировать только UID в моей БД (в createUser()).Затем он вызывает tryFacebookGetToken -

export const doFacebookLogin = async dispatch => {
  let {type, token} =  await Facebook.logInWithReadPermissionsAsync('*** ', {
    permissions: ['public_profile','email']
  });

  if (type === 'cancel'){
    Alert.alert("There is a problem logging you with facebook. Please try again");
    return dispatch({ type: FACEBOOK_LOGIN_FAIL })
  } else {
    await AsyncStorage.setItem('fb_token', token);
    const credential = firebase.auth.FacebookAuthProvider.credential(token);
    await firebase
        .auth()
        .signInAndRetrieveDataWithCredential(credential);
    firebase.auth().onAuthStateChanged((user) => {
      console.log("current user is ", user.uid);
      AsyncStorage.setItem('my_uid', user.uid);
      dispatch(createUser(user.uid));
      dispatch({ type: SAVE_USER, payload: {prop: "uid", value: user.uid}});
      dispatch(tryGetFacebookToken(user.uid));
    });
  }
};

tryGetFacebookToken() получает токен и затем использует его для получения учетных данных пользователя, таких как имя пользователя и изображение профиля FB, а затем сохраняет эти данные во вновь созданном

export const tryGetFacebookToken = (user_id) => async dispatch => {
  let token = await AsyncStorage.getItem('fb_token');
  console.log("got token", token);

  axios.post(`https://graph.facebook.com/me?access_token=${token}&fields=id,name,birthday,link,email,gender,picture.height(200)`)
    .then(function (response) {
      const { id, picture, name, email, gender, link, birthday} = response.data;
      const url = picture.data.url;
      console.log(`my user facebook id ${id} \n picture ${url} \n name ${name} \n link ${link} \n gender ${gender} \n email ${email} \n birthday ${birthday}`);
      if (token) {
          AsyncStorage.setItem('my_url', url);
          AsyncStorage.setItem('my_name', name);
          dispatch({ type: TOKEN_RECEIVED, payload: token});
          dispatch({type: SAVE_USER, payload: {prop: "fbPicture", value: url}});
          dispatch({type: SAVE_USER, payload: {prop: "name", value: name}});
          firebase.database().ref(`/users/${user_id}/`).set({name,photo: url}); //add then statement
          dispatch(updateUserData(user_id,name,url,link, email));
      } else {
        console.log("tryGetFacebookToken did not retrieve token");
      }
    })
    .catch((error) => {Alert.alert(error);});
}

Теперь о проблеме - у меня уже есть около 600 пользователей, и только с 15 из них я не получаю имя пользователя, адрес электронной почты или изображение профиля FB по неизвестной причине.Более того, в аутентификации через firebase я вижу их идентификатор электронной почты на Facebook.Еще одна вещь, которая случается в том, что они как-то переходят на следующую страницу и вводят свой номер телефона, чего не должно было случиться, если бы вход в Facebook не был успешным.

Я предполагаю, что каким-то образом они отбросили требуемый FBданные при входе в систему, но я не смог их воспроизвести.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...