35

问题说明了一切。在 Firebase 中,如何在用户创建帐户时确认电子邮件,或者就此而言,通过电子邮件重置密码。

我可以更广泛地问:有没有办法从 Firebase 发送电子邮件?例如通知等。这不是你通常会在客户端做的事情。

4

9 回答 9

48

更新

请注意,这从来都不是一种非常安全的处理电子邮件验证的方法,而且由于 Firebase 现在支持电子邮件验证,因此应该改用它。

原始答案

我使用密码重置功能解决了电子邮件验证。

在创建帐户时,我给用户一个临时(随机生成的)密码。然后我触发密码重置,它将向用户发送一封包含链接的电子邮件。该链接将允许用户设置新密码。

要生成随机密码,您可以使用类似于以下的代码:

function () {
  var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-'];
  var password = '';
  for(var i = 0; i < 16; i += 1) {
    password += possibleChars[Math.floor(Math.random() * possibleChars.length)];
  }
  return password;
}

请注意,这是在客户端上发生的,因此恶意用户可能会篡改您的逻辑。

于 2014-02-05T15:23:54.577 回答
29

这需要在firebase之外完成。我将用户存储在 /users/ 并保持他们的状态(PENDING、ACTIVE、DELETED)。我有一个小型服务,用于监控处于 PENDING 状态的用户并发送确认电子邮件。其中有一个指向我创建的 Web 服务的链接,用于将用户状态更新为 ACTIVE。

于 2013-07-18T13:15:59.297 回答
23

[Firebase 工程师 - 2014-01-27 更新]

Firebase 简单登录现在支持电子邮件/密码身份验证的密码重置。

每个 Simple Login 客户端库都提供了一种新方法,用于为指定的电子邮件地址生成密码重置电子邮件 -sendPasswordResetEmail()在 Web 和 Android 以及sendPasswordResetForEmail()iOS 上。

此电子邮件将包含一个临时令牌,用户可以使用该令牌登录其帐户并更新其凭据。此令牌将在 24 小时后或用户更改密码时过期,以先到者为准。

另请注意,Firebase 简单登录可启用电子邮件模板以及发送地址(包括来自您的域的付费帐户的白标电子邮件)的完整配置。

要访问此功能,您需要将客户端库更新到v1.2.0或更高版本。要获取最新版本,请查看https://www.firebase.com/docs/downloads.html

此外,请查看https://www.firebase.com/docs/security/simple-login-email-password.html以获取最新的 Firebase 简单登录 - Web 客户端文档。

于 2014-01-27T23:11:40.100 回答
9

截至 2016 年 7 月,您可能不必使用重置链接等。只需使用sendEmailVerification()applyActionCode功能:

简而言之,以下基本上是您在 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)
        })
    };
  }
])

哦,使用上述方法,我认为没有必要在您的用户数据区域中保留对用户电子邮件的验证。从applyActionCode更改emailVerified为。true_false

当用户使用本地帐户登录时,电子邮件验证很重要。但是,对于许多社交身份验证,传入的身份emailVerified已经是true

在使用 Firebase 3.0 SDK 进行电子邮件验证一文中进行了详细说明

于 2016-07-22T18:30:31.160 回答
7

我为解决这个问题所做的工作是使用 Zapier,它具有用于 firebase 的内置 API。它检查添加的子元素的位置。然后它从新节点的数据中获取邮件地址和验证 url 并将它们转发。该 url 指向我的 Angular 应用程序,它将用户电子邮件设置为已验证。

当我在 firebase 中托管我的应用程序文件时,我不需要照顾任何在后台进行轮询的服务器或进程。

有延迟,但因为我在验证邮件之前不会阻止用户,所以没关系。Zapier 有一个免费套餐,因为我没有太多流量,所以暂时是一个不错的解决方法。

于 2014-09-29T19:54:36.483 回答
2

新的 Firebase SDK v3 似乎支持电子邮件地址验证,请参见此处(将您自己的项目 ID 放在链接中),但似乎尚未记录。

我在这里问过关于 SO 的问题

通过官方文档的链接查看@SamQuayle 的答案。

于 2016-07-01T09:47:46.703 回答
1

正如其他人所指出的,Firebase 现在确实支持与帐户相关的电子邮件,但更好的是,截至 10 天前左右,它还支持通过 Firebase Functions 发送任何类型的电子邮件。此处的文档和示例代码中有很多详细信息。

于 2017-03-18T18:50:55.800 回答
0

创建新帐户后,我使用以下代码检查电子邮件验证。

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.")
    }
}
于 2016-09-26T12:28:14.317 回答
-1

我使用了 MandrillApp。您可以创建只允许发送模板的 API 密钥。这样,即使您的密钥已暴露,也不会真正被滥用,除非有人想为您发送大量欢迎电子邮件。

那是让自己脱离地面的技巧。我现在从 EC2 启用 CORS,该 EC2 使用令牌来验证用户是否存在,然后再通过 SES 向他们表示欢迎。

于 2016-02-22T11:12:28.893 回答