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

Proper way to verify user's mobile number using Firebase

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

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

请帮我解决 Firebase 中的这个误解。

客户端在这里绝对有效。流程是这样的:

  1. 您请求使用 phone 号码登录
  2. Firebase Phone 验证服务器向该号码发送代码
  3. 用户将您的代码输入到您的应用程序中,该应用程序会将其发送到 Firebase 身份验证服务器
  4. Firebase Auth 服务器returns你有一个 Firebase Auth 令牌

之所以有效,是因为恶意用户只有拥有您的 phone 才能知道密码。它不能保证设备就是那个 phone 号码的设备(用户可以有两个 phone,或者在笔记本电脑上使用 phone 登录),但它确实验证用户可以访问该号码。

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

有关更多信息,请参阅 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 令牌的内容。

admin SDK 开箱即用,用于检查 ID 令牌的正确证书、受众、到期时间和其他重要属性。

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

decodedToken 也将包含 phone 号码的属性!