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

don*_*rog 4 phone-number firebase firebase-authentication

我知道,我可以使用Firebase's手机上的验证AndroidiOS,但问题是,有关客户端的验证信息可以很容易地在客户端,因为我只使用服务器端的SSL证书伪造的,所以,只有客户端知道服务器是可信的.

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

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

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

Ian*_*ber 8

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

  1. 您使用电话号码申请登录
  2. Firebase Phone Auth服务器将代码发送到该号码
  3. 用户将您的代码输入您的应用程序,然后将其发送到Firebase Auth服务器
  4. Firebase Auth服务器会返回Firebase身份验证令牌

这是有效的,因为恶意用户只有在拥有手机时才能知道代码.它不保证设备是具有该电话号码的设备(用户可以拥有两部电话,或者通过笔记本电脑上的电话登录),但它确实验证用户是否可以访问该号码.

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

有关更多信息,请参阅有关验证ID令牌的文档!

所以你的下一步将是:

检索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();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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

decodedToken 将包含电话号码的属性!