创建用于生成 Firebase CustomToken 的服务器时,我仅使用服务帐户还是以某种方式在幕后还使用用户凭据?

2024-03-04

我们很快就会将该项目投入生产。

1 - 我们的移动应用程序将通过将其发布到我们的内部微服务器来创建汇款。此类 post 请求将返回从我们的内部 NodeJs 服务器生成的 CustomToken。

2 - 我们的内部微服务会将此类传输复制到 Firestore 并相应地更新其在 Firestore 上的状态。

3 - 不是我们的移动应用程序轮询或侦听我们的内部微服务来获取状态,而是侦听 Firestore 以从相应文档获取状态。为了监听,它将使用从步骤 1 中的帖子返回的 CustomToken。我们公司希望仅利用 Google Firestore 的实时数据库功能来实现此项目(反应式方法)。

将我所做的与以下声明进行比较时,您是否看到任何考虑/问题:“Google 在大多数情况下更喜欢您授权使用服务帐户”? (复制自其他相关讨论 https://stackoverflow.com/a/61665443/4148175)

自定义令牌是使用此 NodeJs 服务器在内部创建的,并取决于从经过身份验证的用户中提取的 uid来自 Google Firebase 的身份验证/用户 https://console.firebase.google.com/project/firetestjimis/authentication/users

    const admin = require('firebase-admin');

    exports.serviceAccount = {
      "type": "service_account",
      "project_id": "firetestjimis",
      "private_key_id": "ecfc6 ... fd05923",
      "private_key": "-----BEGIN PRIVATE KEY-----\nMIIE .... 5EKvQ==\n-----END PRIVATE KEY-----\n",
      "client_email": "[email protected] /cdn-cgi/l/email-protection",
      "client_id": "102422819688924138150",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://oauth2.googleapis.com/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fg6p9%40firetestjimis.iam.gserviceaccount.com"
    }

     admin.initializeApp({
       credential: admin.credential.cert(exports.serviceAccount)
    });


var uid = "NS .... Ro2"; //copied from https://console.firebase.google.com/project/firetestjimis/authentication/users
var claim = {
  control: true
};
admin.auth().createCustomToken(uid)
  .then(function (customToken) {
    console.log(customToken)
  })
  .catch(function (error) {
    console.log("Error creating custom token:", error);
  });

我们的手机(Angular 中的示例,但 IOS 和 Android 的想法相同)具有我下载的 SERVICE_ACCOUNT_JSON_FILE,如下所示:

环境.ts:

export const environment = {
  production: false,
  firebaseConfig: {
    apiKey: "AIzaSy ... 3DCGihK3xs",
    authDomain: "firetestjimis.firebaseapp.com",
    databaseURL: "https://firetestjimis.firebaseio.com",
    projectId: "firetestjimis",
    storageBucket: "firetestjimis.appspot.com",
    messagingSenderId: "795318872350",
    appId: "1:7953 ... 32b26fb53dc810f"
  }
};

应用程序组件.ts

  public transfers: Observable<any[]>;

  transferCollectionRef: AngularFirestoreCollection<any>;

  constructor(public auth: AngularFireAuth, public db: AngularFirestore) {
    this.listenSingleTransferWithToken();
  }

  async listenSingleTransferWithToken() {
    await this.auth.signInWithCustomToken("eyJh ### CUSTOMTOKEN GENERATED FROM INTERNAL NODEJS SERVER ABOVE ### CVg");
    this.transferCollectionRef = this.db.collection<any>('transfer', ref => ref.where("id", "==", "1"));
    this.transfers = this.transferCollectionRef.snapshotChanges().map(actions => {
      return actions.map(action => {
        const data = action.payload.doc.data();
        const id = action.payload.doc.id;
        return { id, ...data };
      });
    });
  }
}

据我了解,CustomToken 的创建及其在移动设备上的使用完全依赖于服务帐户。我对吗?我是否错过了一些概念,并且我在幕后使用用户凭据,并且在开发环境中正常工作的东西在生产中会弹出一些惊喜?显然,这个问题全部来自我的免费帐户,但在生产中它将是付费帐户,但这里的代码和步骤将完全相同。

*** 在约翰评论后编辑

事实上,environment.ts 会转到浏览器。如果有问题,也许有听 Firestore 文档经验的 Angular 开发人员可以发表评论


据我所知,您当前创建自定义的方式纯粹基于服务帐户以及您对用户 UID 的隐式了解(您从控制台复制的 UID)。据我所知,您共享的代码中没有涉及其他用户凭据,流程的其他部分也没有涉及其他用户凭据。

我很想了解您如何保护此令牌生成:是什么阻止任何其他网络客户端调用您的listenSingleTransferWithToken方法或以其他方式从数据库读取令牌?

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

创建用于生成 Firebase CustomToken 的服务器时,我仅使用服务帐户还是以某种方式在幕后还使用用户凭据? 的相关文章

随机推荐

  • Servlet 3.1 - 多部分异步处理

    我正在测试 Servlet 3 1 API 来处理多部分请求 我对同步处理某些部分 文本字段 和异步处理其他部分 文件字段 感兴趣 乍一看 它似乎在 Servlet 3 1 中不可用 要么在异步上下文中通过 request getInput
  • 使用adapter-static时如何在sveltekit上使用获取参数?

    我在构建时收到错误消息 无法访问url searchParams在启用预渲染的页面上 如何加载和使用get参数 svelte config js import adapter from sveltejs adapter static imp
  • Twitter bootstrap - 单击时聚焦于模式内的文本区域

    刚刚开始使用 bootstrap 这真是太棒了 我正在尝试解决这个问题 我在模式窗口内有一个用于反馈的文本区域 效果很好 但我希望当您单击按钮激活模式时 焦点位于文本区域上 而且我似乎无法让它发挥作用 这是一个小提琴 http jsfidd
  • 如何更改 Grafana 中的背景颜色?

    我想修改 Grafana 中的深色主题 以便它使用 000000作为背景颜色 我见过 如何更改Grafana的默认黑色 https stackoverflow com questions 41006070 how to change def
  • 使用 msbuild 从 VS 2008 升级到 2010 时未保留构建顺序和依赖项

    我正在升级 VS 2008 解决方案以在 VS 2010 上运行我成功地在 VS 2010 中构建 我现在的下一步是配置运行 TFS 2008 的构建机器每当我开始构建时 它都会按字母顺序执行我的项目 而不考虑依赖关系 我用谷歌搜索了很多
  • 用于检查文件大小是否比之前的检查有所增加的 VB 脚本

    我需要一个 VB 脚本来检查文件大小并捕获它 并在下一次检查中将其与上一次检查进行比较 如果大小增加 则应提示文件大小增加 你可以尝试一下这个vbscript Option Explicit const bytesToKb 1024 Dim
  • 如何将画布内容转换为图像?

    from Tkinter import root Tk cv Canvas root cv create rectangle 10 10 50 50 cv pack root mainloop 我想将画布内容转换为位图或其他图像 然后执行其
  • R 中生存数据的左删失

    我想对左右删失的数据进行生存分析 Kaplan Meier 和 Cox PH 建模 我正在研究特定基因 基因 0 或 1 存在与不存在时发生心律失常 AF 的时间 然而 一些受试者在招募时被发现已经存在心律失常 因此应该进行审查 我已阅读生
  • Twisted 中的多重响应

    我正在尝试开发简单的TCP 使用 Twisted 和 Pygame 进行客户端 服务器游戏 但我在向客户端发送数据时遇到困难 Twisted 不允许我连续发送多个响应 这就是我想做的 我有方法处理玩家状态更改并将其重新发送给其他客户端 de
  • ASP.NET Core 中 Mongodb 数据存储的基于简单令牌的身份验证/授权

    我需要实现非常简单的身份验证机制 基本上有两个角色 Owners and Users 我认为拥有 Enum 就足够了 应用程序本身是SPA 通过Asp net core实现webapi 我看到文章 如何使用 EF Identity 实现它
  • 确定 MIDI 文件的时间划分

    我正在用Python编写一个脚本来解析MIDI文件 是的 我知道Python存在MIDI解析库 但对于我的用例来说 如果我从头开始制作它是最简单的 我遇到的问题之一是时间划分 标头的最后两个字节指定时间划分 但我无法确定文件的时间划分是否以
  • 正则表达式:匹配该字符串

    我无法弄清楚这一点 22 584 r n t t tl 6 579 22 我想匹配 r n t t t 并替换为一个空格 问题是数量 t r and n 波动 周围的人物也是如此 Help s s g s rnt g
  • 如何在 tkinter 中给定时间后运行函数?

    所以我在 tkinter 的画布上有一张 gif 图片 我想让这张照片变成另一张照片 但只持续三秒钟 并将其恢复到原始图片 def startTurn self newgif PhotoImage file 2h gif self left
  • UISlider 无法在原型单元中滑动

    我在故事板的视图控制器中设计了一个原型单元 但不幸的是UISlider细胞内不滑动 Note 此故事板启用了自动布局 Design 这是代码 渲染单元格UITableview UITableViewCell tableView UITabl
  • GitHub PR 使用什么 git 命令来显示差异

    我想使用命令行来生成 GitHub 提供的相同差异 帮助页面将其描述为 头部分支的尖端与头部上次与基础分支同步的提交之间的比较 https help github com articles about comparing branches
  • 拆分unity配置文件

    我需要将我的统一配置拆分为 n 个不同的文件 以便我可以将其中一些文件选择到同一个统一容器中 好的 已经太晚了 但我可以回答 你需要这样的东西 private IUnityContainer ReadContainer var unityC
  • 为什么这个函数没有定义?

    我希望我已经过去了 但为什么单击按钮时调整大小未定义 document ready function var w 320 480 var h 480 620 function resize input scale width w input
  • 如何正确模拟bean HikariDataSource?

    我使用 Mockito 编写了集成测试 但是当设置了与数据库的连接时它可以工作 实际上测试只是检查访问某些端点的可能性 与数据访问层无关 所以我还不需要数据库 数据库关闭时测试失败的原因 HikariDatasource 在 spring
  • 如何限制我的 Windows 应用程序生成进程的单个实例?

    I am working on a Windows application I have created a help file chm using a third party tool and I call it from the Win
  • 创建用于生成 Firebase CustomToken 的服务器时,我仅使用服务帐户还是以某种方式在幕后还使用用户凭据?

    我们很快就会将该项目投入生产 1 我们的移动应用程序将通过将其发布到我们的内部微服务器来创建汇款 此类 post 请求将返回从我们的内部 NodeJs 服务器生成的 CustomToken 2 我们的内部微服务会将此类传输复制到 Fires