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

2024-05-05

我知道我可以使用Firebase's电话验证开启Android and iOS,但问题是有关客户端验证的信息很容易在客户端被伪造,因为我只使用服务器端SSL证书,所以,只有客户端知道服务器是可信的。

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

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

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


客户端在这里绝对可以工作。流程是这样的:

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

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

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

请参阅文档验证 ID 令牌 https://firebase.google.com/docs/auth/admin/verify-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也将包含电话号码的属性!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Firebase 验证用户手机号码的正确方法 的相关文章

随机推荐

  • Android 应用程序 Azure 依赖项 gradle 构建时出错

    我在 Android Studio 2 3 3 的 Gradle 同步中收到以下错误 错误 模块 com microsoft azure azure mobile android 3 3 0 依赖于一个或多个 Android 库 但它是一个
  • 将文件 Google Wear 发送到手机

    我正在尝试将文件从 Google Wear 发送到 Nexus 5 我已阅读一些教程并编写了以下代码 但我的手机未收到文件 Mobile private GoogleApiClient mGoogleApiClient private in
  • 带有路径连接器的 jQuery 可拖动小部件

    参考该图像 Block1 和Block2 都是可拖动的 我的问题是 如何在两个块之间制作红色链状连接器 要求是链条应该延伸到块被拖动的地方 请提供任何教程 学习材料的指示 谢谢 有许多 Jquery 插件可用于创建数据库可视化或流程图的连接
  • 在 Pandas 时间序列图中从 Axes.get_xlim() 获取可用日期

    我试图从用 pandas 创建的时间序列图中获取作为 python 日期时间对象的图的 xlimits 使用ax get xlim 将轴限制返回为numpy float64 我不知道如何将数字转换为可用的日期时间 import pandas
  • 当字段未触及时,角度反应形式返回空值

    在我的用例中 当用户单击编辑按钮时 Angular 会对后端进行 HTTP 调用并检索对象 然后在编辑表单上填充这些值 用户可以更新或保持字段不变 点击时update按钮 Angular 应该获取表单中存在的所有这些值并将它们发送到后端 因
  • 当单元格值和复选框更改时更改工作表

    我有一本包含多个工作表的工作簿 我有一个菜单页面 工作表 其中包含多个用户选择 输入新订单 更新订单等 每个选项旁边都有一个复选框 根据选中的复选框 单元格F4 F21改变自0 to 1并且 细胞B1更改我想要去的工作表的名称 我的主菜单工
  • 如何从 os_log() 查找源文件和行号

    The 记录 Apple 参考 https developer apple com reference os 1891852 logging对于 iOS 10 和 macOS Sierra 中的新日志记录系统 明确表示不要包含行号和源文件信
  • clickedButtonAtIndex 方法未被调用

    当用户点击按钮时UIAlertView the clickedButtonAtIndex应该调用方法 但是 它没有 in the h我已经打电话给UIAlertView协议 interface RechercherViewControlle
  • Laravel 5.4 上传原始文件名和扩展名

    通过表单提交文件时 如何将原始文件名 file jpg 上传到数据库 控制器 public function addCv Request request cv Cv create request gt all file request gt
  • log4net 未记录到数据库

    我有一个奇怪的问题 我的 log4net 设置没有将任何数据记录到数据库中 也没有引发任何异常来通知问题 我已经在一个名为 Log4net Config 的单独文件中定义了配置设置 并且 已经在程序集中引用了它 请注意 我通过 nuget
  • MYSQL中如何获取不带小数的列值

    我的 mysql 表中有两列A and B我正在获取这样的记录 select A B from table 但问题是上面的查询提供了类似这样的值 12 00 3 4 78 9 但我想得到这样的结果 12 3 78 我将使用哪个 MySQL
  • 如何解决 Python 'Pyzbar' 库的导入错误?

    我刚刚开始熟悉 Pyzbar 库 但是当使用decode方法我得到一个错误 这是代码 import cv2 import numpy as np import pyzbar code image cv2 imread C Users Ace
  • 如何在 Python 中使用 Selenium 运行无头 Chrome?

    我正在尝试使用 selenium 进行一些操作 我真的希望我的脚本能够快速运行 我认为使用无头 Chrome 运行我的脚本会使其速度更快 首先 这个假设是否正确 或者我是否使用无头驱动程序运行我的脚本并不重要 我希望无头 Chrome 能够
  • 保护 Spring 支持,当前端使用 adal auth 保护时

    所以我们的应用程序有两个部分 前端 ui 使用 Angular JS 后端 使用Spring boot的rest api 使用 microsoft adal angular6 库通过 Azure Active Directory 进行身份验
  • 使无头浏览器停止加载页面

    我正在使用 watir webdriver ruby gem 它启动浏览器 Chrome 并开始加载页面 页面加载速度太慢 watir webdriver 引发超时错误 如何让浏览器停止加载页面 require watir webdrive
  • 如何在 AWS CDK 堆栈中压缩 Node Lambda 依赖项?

    我正在使用 CDK 通过 API Gateway Lambda 和 DynamoDB 创建一个简单的无服务器项目 到目前为止看起来很酷 但是当我向 Lambda 添加外部依赖项时出现以下错误 Runtime ImportModuleErro
  • 为什么我的 Silverlight 4 浏览器外应用程序只显示白色?

    My 银光应用作品fine当运行在browser 但是当我将其安装为浏览器外应用程序中 窗口框架会出现适当的图标和标题 但窗口的内容是只是白色 它是在开始菜单但当我关闭它并再次打开时 它仍然是空白的 我在上复制了这个Windows 7的 a
  • 更新 PartialView mvc 4

    哎呀 如何使用模型中的数据刷新部分视图 第一次 当页面加载时它可以正常工作 但当我从操作中调用它时却不能正常工作 我创建的结构如下所示 在我看来任何地方 Html RenderAction UpdatePoints 我的部分观点 更新点 h
  • 添加和提交文件后Git推送不起作用

    I m new to Github and Git tried to use gitbash on Windows After adding and committing files If I add the git push cmd Th
  • 使用 Firebase 验证用户手机号码的正确方法

    我知道我可以使用Firebase s电话验证开启Android and iOS 但问题是有关客户端验证的信息很容易在客户端被伪造 因为我只使用服务器端SSL证书 所以 只有客户端知道服务器是可信的 因此 我决定在服务器端发送手机号码并在那里