Jak zaimplementować Microsoft Login z Firebase w React Native?

Sep 01 2020

Obecnie w naszej aplikacji internetowej zaimplementowano logowanie Microsoft za pomocą Firebase. Teraz chcę zrobić to samo z aplikacją React Native. Do tej pory odkryłem, że natywna biblioteka Firebase nie obsługuje bezpośrednio tego dostawcy. Nie firebase.auth.OAuthProvider('microsoft.com')jest też obsługiwany w wersji natywnej.

Następnie w kolejnej próbie zaimplementowałem logowanie Azure z react-native-azure-ad-2pakietem, które zwraca accessToken i dane użytkownika. Teraz próbuję użyć tego tokena, aby zalogować się do Firebase bez powodzenia.

onMicrosoftLoginSuccess(accessToken){
    const credential = auth.OAuthProvider.credential(accessToken);
    auth().signInWithCredential(credential)
    .then(response =>{
        console.log('Respuesta firebase', response);
    })
    .catch(e =>{
        console.log('Error Firebase', e);
    })
}

W ten sposób otrzymuję następujący błąd:

Error Firebase [Error: [auth/invalid-credential] The supplied auth credential is malformed or has expired.]

Każda pomoc jest na prawdę doceniana!

Odpowiedzi

1 kirhammer Sep 02 2020 at 01:28

W końcu znalazłem rozwiązanie. Musiałem użyć niestandardowego tokena, który jest generowany z unikalnym identyfikatorem (w tym przypadku Microsoft UID). Token można wygenerować za pomocą pakietu innej firmy lub za pomocą firebase-admin (czyli tylko po stronie serwera). Utworzyłem więc funkcję chmury w Firebase, która pobiera identyfikator Microsoft i dodatkowe informacje o użytkowniku oraz zwraca token, jak pokazano poniżej:

const tokenPromise = (data) =>{
    return new Promise((resolve, reject) =>{
        admin.auth().createCustomToken(data.uid, data.user)
        .then(response =>{
            console.log('Response', response);
            resolve(response);
        })
        .catch(error =>{
            console.log('Error', error);
            reject(error);
        })
    });
}

Wygenerowany token musi zostać wysłany do Front-endu, aby można było przeprowadzić proces uwierzytelniania Firebase.

auth().signInWithCustomToken(tokenFromServer)
    .then(response =>{
        //response contains user data;
        //You can also access this info from
        firebase.auth().currentUser;
    })
    .catch(e =>{
        console.log('Error Firebase', e);
    });

Jeśli użytkownik o unikalnym identyfikatorze (UID firmy Microsoft) jest nowy, Firebase utworzy nowego użytkownika. W moim przypadku, ponieważ mamy wersję aplikacji internetowej, oznacza to, że jeśli użytkownik loguje się przy użyciu adresu [email protected], Firebase utworzy 2 użytkowników: jednego zalogowanego u dostawcy Microsoft (z aplikacji internetowej) i drugiego z niestandardowym dostawca (z aplikacji React Native).