2017-09-14 3 views
0

Wenn ein neuer Benutzer die Webanwendung registriert, wird eine Bestätigungs-E-Mail an ihn gesendet. Ich verhindere, dass sich neue Benutzer vor der Überprüfung anmelden.Firebase-Handle setzt Passwort-E-Mails für nicht verifizierte Benutzer zurück

Wenn der Bestätigungslink abläuft und der Benutzer das Passwort vergisst, klickt er auf den Link zum Zurücksetzen des Passworts und erhält eine E-Mail.

Also ich denke, dass ich Reset-Passwort Aktion zusammen mit der Überprüfung sofort behandeln sollte. Andernfalls kann sich der Benutzer auch nach Änderung des Passworts nicht anmelden.

function handleResetPassword(auth, actionCode) { 
    auth.verifyPasswordResetCode(actionCode) 
     .then(function (email) { 
      // Showing the reset screen and ask the user for 
      // the new password. 
     }).catch(function (error) { 
     // 
     }); 
}; 

Wenn der Benutzer das neue Passwort speichert:

function saveNewPassword() { 
    auth.confirmPasswordReset(actionCode, vm.form.password).then(function (resp) { 
     // Password reset has been confirmed and new password updated. 
     // Now auto sign in user 
     auth.signInWithEmailAndPassword(vm.email, vm.form.password).catch(function (error) { 
      // Handle Errors here. 
     }); 

     firebase.auth().onAuthStateChanged(function (user) { 
      if (user) { 
       // user signed in. 
       // check whether the user is verified 
       // if not set true 
       user.updateProfile({ emailVerified: true }) 
      } 
     }); 

    }).catch(function (error) { 
     // 

    }); 
} 

Aber der folgende Code nicht funktioniert, wie ich erwartet hatte, da es keinen Einfluss hat. Ich kann andere Benutzerdaten ändern (z. B. displayName), aber nicht (emailVerified). Es funktioniert nur mit Firebase E-Mail-Verifizierung.

user.updateProfile({ emailVerified: true }) 

Was ist der empfohlene Ansatz für diese Art von Benutzerszenario?

Antwort

1

Sie können emailVerified nicht vom Client aktualisieren, andernfalls wäre jeder nicht verifizierte Benutzer in der Lage, dies zu tun, ohne die tatsächliche Eigentümerschaft der E-Mail durchzusetzen. Sie müssten dies mit dem Admin SDK über einen HTTP-Endpunkt tun (Sie können dafür auch Firebase-Funktionen verwenden). Sie müssen jedoch sicherstellen, dass der Code zum Zurücksetzen des Kennworts erfolgreich war. In diesem Fall müssen Sie Ihren Code auf dem Server ausführen. Hier ist, wie es funktionieren würde:

var firebase = require('firebase'); 
var admin = require('firebase-admin'); 
// Initialize the client and admin instances. 
// firebase.initializeApp(clientConfig); 
// admin.initializeApp(adminConfig); 
// Send the reset code and the new password to your backend. 
var email = null; 
// Get email corresponding to code. 
firebase.auth().checkActionCode(actionCode) 
    .then(function(info) { 
    email = info.email; 
    // Confirm password reset. 
    firebase.auth().confirmPasswordReset(actionCode, password) 
    }); 
    .then(function() { 
    // Get uid of user with corresponding email. 
    return admin.auth().getUserByEmail(email); 
    }).then(function(userRecord) { 
    // Password reset succeeded. Email can be verified as the user 
    // must have received the code via their email confirming 
    // ownership. 
    return admin.auth().updateUser(userRecord.uid, {emailVerified: true}); 
    }); 
+0

Im Moment benutze ich benutzerdefinierte E-Mail-Handler die gleichen wie die auf Firebase-Dokumentation beschrieben. Ich habe keinen Backend-Server. Mein Web-App-Hosting ist auf Firebase. Ich suchte nach Firebase Cloud-Funktionen, um damit umzugehen, aber ich konnte nicht. Ich denke, dass Ihr Beispielcode nicht für die Cloud-Funktion ist? –

+0

Sie müssten dafür einen HTTP-Endpunkt mit Firebase-Funktionen erstellen. Weitere Informationen dazu finden Sie in den Dokumenten: https://firebase.google.com/docs/functions/http-events – bojeil

Verwandte Themen