Aggiornamento (20.160.521): Firebase appena rilasciato un importante aggiornamento per il suo Firebase Authentication prodotto, che ora consente a un singolo utente di collegare gli account dei vari provider supportati. Per ulteriori informazioni su questa funzione, leggere la documentazione per iOS, Web e Android. La risposta sotto è lasciata per ragioni storiche.
Il nucleo servizio Firebase fornisce diversi metodi per l'autenticazione: https://www.firebase.com/docs/security/authentication.html
Al suo interno, Firebase utilizza token JWT sicure per l'autenticazione. Tutto ciò che risulta nella produzione di un token JWT (come l'utilizzo di una libreria JWT sul proprio server) funzionerà per autenticare gli utenti su Firebase, in modo da avere il controllo completo sul processo di autenticazione.
Firebase fornisce un servizio chiamato Firebase Simple Login che è un modo per generare questi token (questo fornisce l'autenticazione Facebook, Twitter, ecc.). È concepito per scenari di autenticazione comuni in modo che tu possa essere subito operativo senza server, ma non è l'unico modo per autenticarsi e non è inteso per essere una soluzione completa.
Ecco un approccio per consentire login con diversi operatori di utilizzare Firebase semplice accesso:
- memorizzare un identificativo utente canonica per ogni utente, e una mappatura per ogni identificatore specifico del provider a quello id canonica.
- Aggiorna le tue regole di sicurezza per abbinare le credenziali su un account utente dato, invece di uno solo.
In pratica, le norme di sicurezza potrebbero apparire così, supponendo che si desidera abilitare sia l'autenticazione di Twitter e Facebook (o consentire a un utente di creare un account con uno e poi aggiungere gli altri):
{
"users": {
"$userid": {
// Require the user to be logged in, and make sure their current credentials
// match at least one of the credentials listed below, unless we're creating
// a new account from scratch.
".write": "auth != null &&
(data.val() === null ||
(auth.provider === 'facebook' && auth.id === data.child('facebook/id').val() ||
(auth.provider === 'twitter' && auth.id === data.child('twitter/id').val()))"
}
},
"user-mappings": {
// Only allow users to read the user id mapping for their own account.
"facebook": {
"$fbuid": {
".read": "auth != null && auth.provider === 'facebook' && auth.id === $fbuid",
".write": "auth != null &&
(data.val() == null ||
root.child('users').child(data.val()).child('facebook-id').val() == auth.id)"
}
},
"twitter": {
"$twuid": {
".read": "auth != null && auth.provider === 'twitter' && auth.id === $twuid",
".write": "auth != null &&
(data.val() == null ||
root.child('users').child(data.val()).child('twitter-id').val() == auth.id)"
}
}
}
}
In questo esempio, si memorizza un ID utente globale (che può essere qualsiasi cosa si scelga) e si mantiene la mappatura tra i meccanismi di autenticazione di Facebook, Twitter, ecc. Al record dell'utente principale. Al momento dell'accesso per ciascun utente, recupererai il record utente principale dai mapping utente e utilizzerai quell'ID come archivio principale di dati e azioni dell'utente. Quanto sopra limita e convalida i dati nelle mappature degli utenti in modo che possano essere scritti solo dall'utente corretto che ha già lo stesso ID utente di Facebook, Twitter, ecc. Sotto/utenti/$ userid/(id-facebook | twitter -id | etc-id).
Questo metodo consente di essere subito operativi. Tuttavia, se si dispone di un caso d'uso complicato e si desidera ottenere il controllo completo dell'esperienza di autenticazione, è possibile eseguire il proprio codice di autenticazione sui propri server.Esistono molte utili librerie open source che è possibile utilizzare per eseguire questa operazione, ad esempio everyauth e passport.
È inoltre possibile eseguire l'autenticazione utilizzando provider di autenticazione di terze parti. Ad esempio, è possibile utilizzare Singly, che ha un'enorme varietà di integrazioni out-of-the-box senza dover scrivere alcun codice lato server.
ho alcune domande per voi su questa strategia trovato qui: http://stackoverflow.com/questions/22886053/can-the-firebase-auth-object -handle-simultanea-authentication-types –
Non riesco a vedere la differenza tra '.child ('twitter/id'). val()' e '.child ('twitter-id'). val()'. Sono entrambi riferimenti diversi? Non l'ho capito. – Jobsamuel
Grazie mille per l'esempio di mappatura. Sarebbe possibile seguire un po 'di codice su come farlo su iOS? –