La question dit tout. Dans Firebase, comment puis-je confirmer le courrier électronique lorsqu'un utilisateur crée un compte ou, ce faisant, réinitialiser le mot de passe par courrier électronique?.
Je pourrais poser une question plus générale: existe-t-il un moyen d'envoyer des courriels à partir de Firebase? Par exemple. notifications, etc. Ce n'est pas le genre de chose que vous feriez habituellement du côté client.
Cela devrait être fait en dehors de firebase. Je stocke les utilisateurs sur/users/et leur attribue un statut (PENDING, ACTIVE, DELETED). J'ai un petit service qui surveille les utilisateurs d'un statut PENDING et envoie un email de confirmation. Qui contient un lien vers un service Web que j'ai créé pour mettre à jour le statut de l'utilisateur sur ACTIVE.
Mettre à jour
Notez que cela n’a jamais été un moyen très sûr de gérer la vérification des e-mails et que, puisque Firebase prend désormais en charge la vérification des e-mails, il devrait probablement être utilisé à la place.
Réponse originale
J'ai résolu la vérification de l'e-mail à l'aide de la fonction de réinitialisation du mot de passe.
Lors de la création du compte, je donne à l'utilisateur un mot de passe temporaire (généré aléatoirement). Je déclenche ensuite une réinitialisation du mot de passe qui envoie un courrier électronique à l'utilisateur avec un lien. Le lien permettra à l'utilisateur de définir un nouveau mot de passe.
Pour générer un mot de passe aléatoire, vous pouvez utiliser un code similaire à celui-ci:
function () {
var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-'];
var password = '';
for(var i = 0; i < 16; i += 1) {
password += possibleChars[Math.floor(Math.random() * possibleChars.length)];
}
return password;
}
Notez que cela se produit sur le client, ainsi un utilisateur malveillant pourrait altérer votre logique.
[Engineer at Firebase - Mise à jour du 2014-01-27]
Firebase Simple Login prend désormais en charge les réinitialisations de mot de passe pour l'authentification par courrier électronique/mot de passe.
Une nouvelle méthode a été donnée à chacune des bibliothèques client de Simple Login pour générer des courriels de réinitialisation de mot de passe pour l’adresse électronique spécifiée - sendPasswordResetEmail()
sur le Web et Android, et sendPasswordResetForEmail()
sur iOS.
Cet e-mail contient un jeton temporaire que l'utilisateur peut utiliser pour se connecter à son compte et mettre à jour ses informations d'identification. Ce jeton expirera au bout de 24 heures ou lorsque l'utilisateur changera son mot de passe, selon la première éventualité.
Notez également que Firebase Simple Login permet la configuration complète du modèle de courrier électronique, ainsi que de l'adresse d'envoi (y compris le courrier électronique avec étiquette blanche de votre domaine pour les comptes payants).
Pour accéder à cette fonctionnalité, vous devez mettre à jour votre bibliothèque client vers une version de v1.2.0
ou supérieure. Pour récupérer la dernière version, consultez https://www.firebase.com/docs/downloads.html .
Consultez également https://www.firebase.com/docs/security/simple-login-email-password.html pour obtenir la dernière documentation Firebase Simple Login - Web Client.
En juillet 2016, vous n'avez peut-être pas à utiliser le lien de réinitialisation, etc. Utilisez simplement les fonctions sendEmailVerification()
ET applyActionCode
:
En bref, voici comment vous allez aborder cela dans AngularJS:
// thecontroller.js
$scope.sendVerifyEmail = function() {
console.log('Email sent, whaaaaam!');
currentAuth.sendEmailVerification();
}
// where currentAuth came from something like this:
// routerconfig
....
templateUrl: 'bla.html',
resolve: {
currentAuth:['Auth', function(Auth) {
return Auth.$requireSignIn() // this throws an AUTH_REQUIRED broadcast
}]
}
...
// intercept the broadcast like so if you want:
....
$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
if (error === "AUTH_REQUIRED") {
$state.go('login', { toWhere: toState });
}
});
....
// So user receives the email. How do you process the `oobCode` that returns?
// You may do something like this:
// catch the url with its mode and oobCode
.state('emailVerify', {
url: '/verify-email?mode&oobCode',
templateUrl: 'auth/verify-email.html',
controller: 'emailVerifyController',
resolve: {
currentAuth:['Auth', function(Auth) {
return Auth.$requireSignIn()
}]
}
})
// Then digest like so where each term is what they sound like:
.controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef',
function($scope, $stateParams, currentAuth, DatabaseRef) {
console.log(currentAuth);
$scope.doVerify = function() {
firebase.auth()
.applyActionCode($stateParams.oobCode)
.then(function(data) {
// change emailVerified for logged in User
console.log('Verification happened');
})
.catch(function(error) {
$scope.error = error.message;
console.log(error.message, error.reason)
})
};
}
])
Et ooh, avec l'approche ci-dessus, je ne pense pas qu'il soit nécessaire de conserver la vérification du courrier électronique de votre utilisateur dans votre zone de données utilisateur. Le applyActionCode
change le emailVerified
en true
de false
.
La vérification du courrier électronique est importante lorsque les utilisateurs se connectent avec le compte local. Cependant, pour de nombreuses authentifications sociales, la variable emailVerified
entrante sera déjà true
.
Explication plus détaillée dans l'article Vérification du courrier électronique avec le SDK Firebase 3.0
Ce que j'ai fait pour contourner ce problème a été d'utiliser Zapier, qui possède une API intégrée pour firebase. Il vérifie l'emplacement des éléments enfants ajoutés. Ensuite, il prend l'adresse mail et une URL de vérification des données des nouveaux nœuds et les envoie. L'URL pointe vers mon application angulaire, qui définit l'e-mail de l'utilisateur comme vérifié.
En hébergeant mes fichiers d'application dans Firebase, je n'ai pas besoin de m'occuper de serveurs ou de processus effectuant des interrogations en arrière-plan.
Il y a un délai, mais comme je ne bloque pas les utilisateurs avant de vérifier les e-mails, ça va. Zapier a un niveau gratuit et comme je n'ai pas beaucoup de trafic, c'est une solution de contournement décente pour le moment.
Le nouveau SDK v3 de Firebase semble prendre en charge la vérification d’adresse électronique. Voir ici (mettez votre propre identifiant de projet dans le lien), mais cela ne semble pas encore être documenté.
J'ai posé la question sur SO ici
Voir la réponse de @ SamQuayle avec ce lien vers la documentation officielle .
J'ai utilisé le code suivant pour vérifier la vérification de l'email après avoir créé un nouveau compte.
let firAuth = FIRAuth.auth()
firAuth?.addAuthStateDidChangeListener { auth, user in
if let loggedUser = user {
if loggedUser.emailVerified == false {
loggedUser.sendEmailVerificationWithCompletion({ (error) in
print("error:\(error)")
})
}
else {
print(loggedUser.email)
}
} else {
// No user is signed in.
print("No user is signed in.")
}
}