Я создал систему аутентификации входа в 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данные при входе в систему, но я не смог их воспроизвести.