将 NodeJs 与 Firebase 一起使用 - 安全性

     2023-03-07     299

关键词:

【中文标题】将 NodeJs 与 Firebase 一起使用 - 安全性【英文标题】:Using NodeJs with Firebase - Security 【发布时间】:2013-01-18 09:30:46 【问题描述】:

由于需要做一些服务器端代码 - 主要是发送电子邮件,我决定使用 Nodejs 和 Express 作为服务器端元素以及 Firebase 来保存数据 - 部分来自学习经验。

我的问题是,在使用 Simple Email & Password API 进行身份验证时,使用客户端 Firebase 库和 Nodejs 库的最佳方法是什么。如果我在客户端进行身份验证,然后在 NodeJS 端调用不同的路由,则该用户的身份验证将在请求中进行。在 Node 中验证用户的测试方法是什么。

我假设的一种方法是从 firebase 获取当前用户的用户名和密码,然后将它们发布到 NodeJS,然后使用服务器上的 firebase 安全 API 进行测试。

【问题讨论】:

【参考方案1】:

本质上,这里的问题是您需要安全地向您的 NodeJS 服务器传达客户端已通过 Firebase 身份验证的身份。有几种方法可以解决这个问题,但最简单的可能是让所有客户端NodeJS 通信都通过 Firebase 本身。

因此,与其让客户端访问您的 NodeJS 服务器提供的 REST 端点,不如让客户端写入您的 NodeJS 服务器正在监控的 Firebase 位置。然后您可以使用 Firebase 安全规则来验证客户端写入的数据,并且您的服务器可以信任它。

例如,如果您想让用户可以通过您的应用程序发送任意电子邮件(您的 NodeJS 服务器负责实际发送电子邮件),您可以有一个 /emails_to_send 位置,其规则如下:


  "rules": 
    "emails_to_send": 
      "$id": 
        ".write": "!data.exists() && newData.child('from').val() == auth.email",
        ".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])"
      
    
  

然后在客户端你可以这样做:

ref.child('emails_to_send').push(
  from: 'my_email@foo.com', 
  to: 'joe@example.com', 
  subject: 'hi', 
  body: 'Hey, how\'s it going?'
);

在您的 NodeJS 代码中,您可以使用 Firebase 机密调用 .auth()(这样您就可以读取和写入所有内容),然后执行以下操作:

ref.child('emails_to_send').on('child_added', function(emailSnap) 
  var email = emailSnap.val();
  sendEmailHelper(email.from, email.to, email.subject, email.body);

  // Remove it now that we've processed it.
  emailSnap.ref().remove();
);

这将是最简单也是最正确的解决方案。例如,如果用户通过 Firebase 注销,他们将无法再写入 Firebase,因此他们将无法再让您的 NodeJS 服务器发送电子邮件,这很可能是您想要的行为。这也意味着如果您的服务器暂时关闭,当您启动它备份时,它会“赶上”发送电子邮件,一切都会继续工作。

【讨论】:

这是很好的建议 - 谢谢。也许可以扩展 firebase 文档以包含此类架构建议。 这样,电子邮件发送的错误处理也应该通过 Firebase 完成...仅供参考 另请参阅firebase-queue,它为消费者(客户端和特权服务器)之间的这种传送提供了一个很好的策略 在这种情况下,发送电子邮件的节点服务器是否需要 SSL。还是标准的 http 就足够了?【参考方案2】:

以上似乎是一种迂回的做事方式,我会使用https://www.npmjs.com/package/connect-session-firebase之类的东西并以firebase为模型,通过express处理所有路由。如果您的 express 服务器正在呈现模板,而不仅仅是作为 JSON API 表现,则更容易。

【讨论】:

将 Firebase 身份验证与 Firestore 一起使用的正确方法是啥?

】将Firebase身份验证与Firestore一起使用的正确方法是啥?【英文标题】:What\'stheproperwaytouseFirebaseAuthenticationalongwithFirestore?将Firebase身份验证与Firestore一起使用的正确方法是什么?【发布时间】:2021-07-0409:02:17【问题描述】:大家... 查看详情

将 Firebase 身份验证与新的 @App 协议一起使用

】将Firebase身份验证与新的@App协议一起使用【英文标题】:UsingFirebaseAuthenticationwithnew@Appprotocol【发布时间】:2020-12-1619:38:28【问题描述】:我是iOS开发新手,正在努力使用SwiftUI中的新@App协议实现Firebase手机身份验证。Firebase的... 查看详情

将 Google 身份验证令牌与 Firebase 一起使用

】将Google身份验证令牌与Firebase一起使用【英文标题】:UseGoogleauthenticationtokenwithFirebase【发布时间】:2016-03-0117:21:51【问题描述】:我有一个.NET应用程序(不是网络应用程序),其中用户已通过Google授权进行身份验证,因此已... 查看详情

我可以将 SafetyNet 与 firebase 功能一起使用吗?

】我可以将SafetyNet与firebase功能一起使用吗?【英文标题】:CanIuseSafetyNetwithfirebasefunctions?【发布时间】:2021-08-2304:17:48【问题描述】:我正在尝试在我的应用中实现SafetyNet。我也没有服务器,我正在使用FirebaseFirestore和FirebaseFunc... 查看详情

将 Firebase 模拟器与 AngularFire 一起使用

】将Firebase模拟器与AngularFire一起使用【英文标题】:UsingFirebaseemulatorwithAngularFire【发布时间】:2019-08-0921:52:31【问题描述】:我正在尝试在我的Angular7应用程序中使用新推出的Firestore模拟器。根据thisdocumentation,我在127.0.0.1:8080... 查看详情

如何将 Firebase 存储与自定义服务器一起使用?

】如何将Firebase存储与自定义服务器一起使用?【英文标题】:Howtousefirebasestoragealongwithcustomserver?【发布时间】:2019-11-2801:01:21【问题描述】:我计划将Firebase存储用作我的应用的图像存储桶。我应该使用客户端firebaseSDK将图像直... 查看详情

将 Firebase 身份验证与自定义提供程序一起使用

】将Firebase身份验证与自定义提供程序一起使用【英文标题】:UsingFirebaseAuthwithCustomproviders【发布时间】:2021-01-0312:06:54【问题描述】:我在一个需要使用Facebook、Twitter、Google和Twitch进行身份验证的辅助项目中使用Firebase。不幸... 查看详情

如何将 Flutter Bloc 与 Firebase 电话身份验证一起使用

】如何将FlutterBloc与Firebase电话身份验证一起使用【英文标题】:HowtouseFlutterBlocwithFirebasePhoneAuth【发布时间】:2020-04-2602:23:20【问题描述】:我正在尝试使用FlutterBloc模式实现Firebase电话授权。我有以下代码import\'dart:async\';import\'p... 查看详情

将 google firebase 分析与 iOS 操作扩展一起使用

】将googlefirebase分析与iOS操作扩展一起使用【英文标题】:UsegooglefirebaseanalyticswithiOSactionextension【发布时间】:2016-07-1315:59:28【问题描述】:我想收集一些用户的信息,这些用户正在使用我的iOS应用的操作扩展和谷歌Firebase分析... 查看详情

将 Firebase Analytics 与命名的 FirebaseApp 一起使用

】将FirebaseAnalytics与命名的FirebaseApp一起使用【英文标题】:UsingFirebaseAnalyticswithanamedFirebaseApp【发布时间】:2020-03-2622:33:40【问题描述】:我正在尝试将FirebaseAnalytics与我的应用程序集成。我已经链接了正确的框架并安装了谷歌... 查看详情

Flutter - 无法将 MethodChannel 与 Firebase onBackgroundMessage 一起使用

】Flutter-无法将MethodChannel与FirebaseonBackgroundMessage一起使用【英文标题】:Flutter-FailedtouseMethodChannelwithFirebaseonBackgroundMessage【发布时间】:2020-06-1606:11:18【问题描述】:在应用程序关闭时尝试打开android活动时失败。在下面的代码... 查看详情

尝试将 ExpansionPanelList/ExpansionPanel 与(Firebase)流一起使用时出现颤振错误

】尝试将ExpansionPanelList/ExpansionPanel与(Firebase)流一起使用时出现颤振错误【英文标题】:FluttererrorwhentryingtouseExpansionPanelList/ExpansionPanelwith(Firebase)stream【发布时间】:2020-07-0208:56:34【问题描述】:我有以下代码sn-p:@overrideWidgetb... 查看详情

将 Nodejs 与 Typescript 一起使用

】将Nodejs与Typescript一起使用【英文标题】:UsingNodejswithTypescript【发布时间】:2012-12-1412:58:06【问题描述】:我想在我的typescript项目中使用Nodejs,并从https://github.com/borisyankov/DefinitelyTyped/tree/master/node下载了node.d.ts但是VisualStudio在... 查看详情

如何将 Firebase 与 Spring Boot REST 应用程序一起使用?

】如何将Firebase与SpringBootREST应用程序一起使用?【英文标题】:HowtouseFirebasewithSpringbootRESTApplication?【发布时间】:2017-01-0402:50:54【问题描述】:我有一个SpringBootREST应用程序,它依赖于Firebase中完成的身份验证。在客户端Firebase... 查看详情

将 Metabase 与 Firebase 实时数据库一起使用进行数据分析 [关闭]

】将Metabase与Firebase实时数据库一起使用进行数据分析[关闭]【英文标题】:UsingMetabasewithFirebaseRealtimeDatabasefordataanalytics[closed]【发布时间】:2018-05-1709:16:39【问题描述】:是否可以设置和使用Metabase(https://metabase.com/)直接(或间接... 查看详情

如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用

】如何将firebase的firestore/adminsdk与next.js一起使用【英文标题】:HowcanIusefirebase\'sfirestore/adminsdkwithnext.js【发布时间】:2019-10-2411:10:29【问题描述】:我正在使用firebase和next.js构建一个应用程序我对这个设置相当陌生,对s-s-r完全... 查看详情

将 JWT 与 nodejs 和 express 一起使用

】将JWT与nodejs和express一起使用【英文标题】:UsingJWTwithnodejsandexpress【发布时间】:2020-04-3009:00:29【问题描述】:我正在尝试在后端添加JWT而不是express-session。我不知道如何将它与nodejs+路由一起使用。我试过这个,所以我可以在... 查看详情

将 Firebase App Check Debug Provider 与 Angular 一起使用

】将FirebaseAppCheckDebugProvider与Angular一起使用【英文标题】:UsingFirebaseAppCheckDebugProviderwithAngular【发布时间】:2022-01-0109:43:51【问题描述】:这不是HowtoinitialiseFirebaseAppCheckinAngular的副本,因为我可以使用reCAPTCHAEnterprise成功初始化... 查看详情