使用Firebase验证用户手机号码的正确方法

时间:2017-07-20 21:26:50

标签: firebase firebase-authentication phone-number

我知道我可以在Firebase'sAndroid上使用iOS电话验证,但问题是有关客户端验证的信息很容易在客户端伪造,因为我仅使用服务器端SSL证书,因此,只有客户端知道服务器是受信任的。

所以,我决定在服务器端发送手机号码并在那里检查:发送验证码并向用户询问此验证码。但我看不到任何C ++服务器Firebase SDK,只有客户端C ++ SDK可用。 所以,我有两个选择:

  • 了解如何在服务器端信任客户端验证(请注意,我可以拥有不受信任的客户端)?所以,这意味着我可以使用主要的Firebase电话号码身份验证方法。
  • 使用服务器端电话验证。

请帮助我解决Firebase中的这种误解。

1 个答案:

答案 0 :(得分:8)

客户端绝对适用于此。流程是这样的:

  1. 您使用电话号码申请登录
  2. Firebase Phone Auth服务器向该号码发送代码
  3. 用户将您的代码输入您的应用,然后将其发送到Firebase Auth服务器
  4. Firebase Auth服务器会返回Firebase身份验证令牌
  5. 这是有效的,因为恶意用户只有在拥有手机时才能知道代码。它并不能保证设备是具有该电话号码的设备(用户可以拥有两部电话,或者通过笔记本电脑上的电话登录),但它确实验证用户是否可以访问该号码。

    要验证您自己的后端,请检索Firebase ID令牌。这只是一小块base64编码的JSON,但重要的是它由Firebase加密签名。这意味着在您的服务器上,您可以验证它是否真的是由Firebase创建的,用于包含在其中的用户和电话号码。用户无法访问基础帐户,也无法生成其中一个令牌。

    有关详情,请参阅verifying ID tokens上的文档。

    所以接下来的步骤将是:

    检索Firebase ID令牌

    您可以在登录后随时执行此操作。

    FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
       mUser.getToken(true)
        .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
            public void onComplete(@NonNull Task<GetTokenResult> task) {
                if (task.isSuccessful()) {
                    String idToken = task.getResult().getToken();
                    // Send token to your backend via HTTPS
                    // ...
                } else {
                    // Handle error -> task.getException();
                }
            }
        });
    

    在服务器上验证ID令牌的内容。

    管理员SDK设置为开箱即用,以检查ID令牌的正确证书,受众,到期日期和其他重要属性。

    admin.auth().verifyIdToken(idToken)
      .then(function(decodedToken) {
        var uid = decodedToken.uid;
        // ...
      }).catch(function(error) {
        // Handle error
      });
    

    decodedToken也会包含电话号码的属性!