有没有办法对Firebase用户创建和/或密码重置进行电子邮件确认?

有没有办法对Firebase用户创建和/或密码重置进行电子邮件确认?,firebase,firebase-security,Firebase,Firebase Security,问题说明了一切。在Firebase中,当用户创建帐户时,我如何确认电子邮件,或者通过电子邮件重置密码 我可以更广泛地问:有没有办法从Firebase发送电子邮件?例如通知等。这不是您通常在客户端执行的操作。这需要在firebase之外执行。我将用户存储在/users/,并对其保持状态(挂起、活动、删除)。我有一个小型服务,它可以监视用户的挂起状态,并发送确认电子邮件。它有一个指向我创建的Web服务的链接,用于将用户状态更新为活动 [消防基地工程师-更新2014-01-27] Firebase S

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


我可以更广泛地问:有没有办法从Firebase发送电子邮件?例如通知等。这不是您通常在客户端执行的操作。

这需要在firebase之外执行。我将用户存储在/users/,并对其保持状态(挂起、活动、删除)。我有一个小型服务,它可以监视用户的挂起状态,并发送确认电子邮件。它有一个指向我创建的Web服务的链接,用于将用户状态更新为活动

[消防基地工程师-更新2014-01-27]

Firebase Simple Login现在支持电子邮件/密码身份验证的密码重置

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

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

还请注意,Firebase Simple Login支持电子邮件模板和发送地址的完整配置(包括来自您域的付费帐户的白标签电子邮件)

要访问此功能,您需要将客户端库更新为
v1.2.0
或更高版本。要获取最新版本,请查看


另外,请查看最新的Firebase简单登录-Web客户端文档。

更新

请注意,这从来都不是一种非常安全的处理电子邮件验证的方法,而且由于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;
}
函数(){
var possibleChars=['ABCDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?'];
var密码=“”;
对于(变量i=0;i<16;i+=1){
password+=possibleChars[Math.floor(Math.random()*possibleChars.length)];
}
返回密码;
}

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

我所做的是使用Zapier,它为firebase内置了API。它检查添加子元素的位置。然后,它从新节点的数据中获取邮件地址和验证url,并将其转发。url指向我的angular应用程序,它将用户电子邮件设置为已验证

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


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

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


那是一次让我自己离开地面的黑客攻击。我现在从EC2启用CORS,该EC2使用令牌验证用户是否存在,然后再通过SES向他们表示欢迎。

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

我已就此提出问题


请看@SamQuayle的答案

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

简言之,以下是您在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
false
更改为
true

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


在文章中详细解释了创建新帐户后,我使用以下代码检查电子邮件验证

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.")
    }
}

正如其他人所指出的那样,Firebase现在确实支持与帐户相关的电子邮件,但更棒的是,在大约10天前,它还支持通过Firebase功能发送任何类型的电子邮件。示例代码中有很多详细信息。

因此,尽管Firebase很好,但我仍然需要一个服务器进程来监视它。支付处理也是如此,例如使用Stripe。我可以从浏览器中请求,获取令牌,将其交给Firebase(或Backfundle,或任何你喜欢的东西),但要真正处理付款并知道付款通过了,我需要一些外部服务器流程。是的,我看到了。我当然明白BaaS的概念,多次重复建设基础设施和公共服务。尽管如此,还是有一些非常常见的服务,如Stripe和email sending之类的支付服务,如果能消除最后一种服务,那就太好了。一个更优雅的解决方案是Firebase提供Webhook。这样,您就不需要中间进程/服务器来进行监视。Firebase现在可以发送定制的密码重置电子邮件:.+1,这是一个非常创新的解决方案!谢谢是否有任何方法可以从security r中访问用户的已验证电子邮件