如何在没有客户端身份验证的情况下从服务器验证 Firebase 用户?

     2023-02-23     10

关键词:

【中文标题】如何在没有客户端身份验证的情况下从服务器验证 Firebase 用户?【英文标题】:How to authenticate a firebase user from server without client side auth? 【发布时间】:2018-03-19 11:46:31 【问题描述】:

我有一个 API,它使用 node admin sdk 连接并调用 firebase。我的客户使用我的 api 获取他们需要的所有东西。我不希望他们直接调用 firebase 进行身份验证,因为我希望客户端代码与 api 和后端分离。

服务器如何对它们进行身份验证?根据当前的文档,即使客户端至少必须向 api 提供他们的 uid(假设他们自己进行了身份验证,对吗?)。

理想情况下,客户端会在 POST 的正文中通过 ssl 向我的 api 提供用户名和密码,然后 api 会将他们登录并发回他们的 id 令牌。推荐的方法是什么?

【问题讨论】:

【参考方案1】:

如果您想使用 Firebase 进行身份验证,最好由客户端 SDK 在客户端处理。这是因为身份验证是基于 IP 地址的速率限制,它还允许您跳过会话管理和持久性中的编码过程。

但是,如果您希望登录/用户数量较少,您可以通过在您的服务器上托管客户端 SDK 并将请求手动发送到 Firebase 来实现您想要的。

// app.js

const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const express = require('express');
const firebase = require('firebase'); // client SDK

firebase.initializeApp(
  apiKey: "<API_KEY>",
  authDomain: "<PROJECT_ID>.firebaseapp.com"
);

const app = express();
app.use(bodyParser.json());
app.use(cookieParser(['array', 'of', 'secrets']));

// on future requests, the UID can be found using `req.cookies['__session'].uid`

app.post('/login', function (req, res, next) 
  if (!req.body.email) return res.status(400).json(error: 'missing email');
  if (!req.body.password) return res.status(400).json(error: 'missing password');

  firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE) // don't persist auth session
  .then(function() 
    return firebase.auth().signInWithEmailAndPassword(req.body.email, req.body.password)
  );
  .then((user) =>  // https://firebase.google.com/docs/reference/js/firebase.User
    let uid = user.uid;

    // set cookie with UID or some other form of persistence
    // such as the Authorization header
    res.cookie('__session',  uid: uid ,  signed: true, maxAge: 3600 );
    res.set('cache-control', 'max-age=0, private') // may not be needed. Good to have if behind a CDN.
    res.send('You have successfully logged in');

    return firebase.auth().signOut(); //clears session from memory
  )
  .catch((err) => 
    next(err);
  );
);

module.exports = app;

注意:您也可以考虑使用 Cloud Functions 将您的 API 放在一起。根据您的用例,这可能是具有成本效益的选择。

【讨论】:

谢谢,很酷,如果需要,我们可以在服务器上运行客户端库。我现在将在客户端中保留会话管理,看看我在该设置方面能走多远。【参考方案2】:

只是想提供一个更新:可以在这里找到使用未记录的 REST API 的答案:Firebase REST auth when creating token with node.js admin sdk

如果可以,我会将其标记为答案。

【讨论】:

如何在没有手动浏览器身份验证的情况下从 Meteor.js 应用程序对 GMail-api 进行 oauth (2) 身份验证?

...:我想在没有手动浏览器身份验证的情况下登录我的流星服务器程序。所以认证 查看详情

为 Web API 实施 Azure AD 身份验证,可以在有和没有用户上下文的情况下从多个客户端调用?

...eAD身份验证,可以在有和没有用户上下文的情况下从多个客户端调用?【英文标题】:ImplementAzureADauthenticationforWebAPIwhichcanbecalledfrommultipleclientswithandwithoutusercontext?【发布时间】:2021-10-2607:32:36【问题描述】:Net核心应用程序和... 查看详情

如何在未经身份验证的情况下从 Google Play 商店请求应用程序信息

】如何在未经身份验证的情况下从GooglePlay商店请求应用程序信息【英文标题】:HowtorequestappinfofromGooglePlaystorewithoutauthentication【发布时间】:2013-01-1606:51:10【问题描述】:我做了一些研究,偶然发现了以下(可能是非官方的)网... 查看详情

为啥我的 REST 服务 .NET 客户端会在没有身份验证标头的情况下发送每个请求,然后使用身份验证标头重试?

】为啥我的REST服务.NET客户端会在没有身份验证标头的情况下发送每个请求,然后使用身份验证标头重试?【英文标题】:WhywouldmyRESTservice.NETclientssendeveryrequestwithoutauthenticationheadersandthenretryitwithauthenticationheader?为什么我的REST服... 查看详情

java示例代码_CXF RESTful客户端-如何在没有Spring的情况下进行基本http身份验证

java示例代码_CXF RESTful客户端-如何在没有Spring的情况下进行基本http身份验证 查看详情

JSF:在没有自定义消息的情况下从验证消息中删除客户端 ID(标签、组件 ID)

】JSF:在没有自定义消息的情况下从验证消息中删除客户端ID(标签、组件ID)【英文标题】:JSF:removeclientid(label,componentid)fromvalidationmessagewithoutacustommessage【发布时间】:2012-09-2212:26:37【问题描述】:我有以下代码:<h:inputTexti... 查看详情

如何在没有 x5c 的情况下从 jwks 验证 JWT 的签名

】如何在没有x5c的情况下从jwks验证JWT的签名【英文标题】:HowtovalidatesignatureofJWTfromjwkswithoutx5c【发布时间】:2020-08-0706:03:59【问题描述】:我有一个JWT安全令牌,我需要通过jwks端点进行验证。jwks中的数据如下所示:"keys":["kty":"... 查看详情

如何在没有 Microsoft 身份的情况下对 blazor 服务器进行 jwt 身份验证?

】如何在没有Microsoft身份的情况下对blazor服务器进行jwt身份验证?【英文标题】:howtojwtauthenticationblazorserverwithoutmicrosoftidentity?【发布时间】:2020-05-1207:22:28【问题描述】:我正在使用blazor服务器(不使用webapi、httpclient和...)我... 查看详情

是否可以在没有 OAuth2 身份验证对话框的情况下从 Google App-Engine (python) 连接和查询 BigQuery 表?

】是否可以在没有OAuth2身份验证对话框的情况下从GoogleApp-Engine(python)连接和查询BigQuery表?【英文标题】:IsitpossibletoconnectandqueryaBigQuerytablefromGoogleApp-Engine(python)withoutOAuth2authenticationdialog?【发布时间】:2017-01-1922:51:16【问题描述... 查看详情

如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?

】如何在没有身份验证的情况下直接向SMTP服务器发送邮件?【英文标题】:HowtosendamaildirectlytoSMTPserverwithoutauthentication?【发布时间】:2012-04-0313:00:28【问题描述】:我想通过直接连接到smtp.gmail.com,直接从脚本向Gmail电子邮件帐... 查看详情

在不泄露密钥的情况下从 Flash 客户端验证文件的真实性

】在不泄露密钥的情况下从Flash客户端验证文件的真实性【英文标题】:VerifyfileauthenticityfromFlashclientwithoutrevealingkey【发布时间】:2014-01-2800:29:54【问题描述】:我正在构建一个在网络上运行的Flash应用程序,用户可以在其中访问... 查看详情

如何在不访问身份验证服务器的情况下验证 OAuth2 访问令牌 (JWT)

...:2018-02-2302:00:08【问题描述】:试图了解OAuth2中的2-legged客户端凭据方案。有人说JWT是访问令牌的绝佳格式,因为它是自包含的,资源服务器不需要验证来自授权服务器(STS)的令牌。 查看详情

如何在没有身份验证的情况下更新字段?

】如何在没有身份验证的情况下更新字段?【英文标题】:Howtoupdateafieldwithoutauthentication?【发布时间】:2018-04-1508:53:44【问题描述】:更新计数器时如何不更新审计员?在我的数据库中,我有一个名为products的表,我想实现一个... 查看详情

我在 Spring Boot 中放置了基本身份验证,但是我们如何在没有身份验证登录的情况下访问一些 Api

】我在SpringBoot中放置了基本身份验证,但是我们如何在没有身份验证登录的情况下访问一些Api【英文标题】:IputbasicauthenticationinspringbootbuthowweaccesssomeApiwithoutauthenticationlogin【发布时间】:2020-05-1922:08:34【问题描述】:根据标题... 查看详情

没有客户端组件的基于 IBM MFP 适配器的身份验证

】没有客户端组件的基于IBMMFP适配器的身份验证【英文标题】:IBMMFPAdapter-basedauthenticationwithoutclient-sidecomponents【发布时间】:2018-07-0812:41:39【问题描述】:如何在不安装mfp客户端sdk/libs的情况下使用基于MFP(8.0)适配器的身份验证... 查看详情

如何在没有身份验证的情况下创建 JWT 令牌

】如何在没有身份验证的情况下创建JWT令牌【英文标题】:HowtocreateaJWTTokenwithoutauthentication【发布时间】:2019-05-2223:59:25【问题描述】:“laravel/framework”:“5.7.*”"tymon/jwt-auth":"dev-develop"我正在尝试使用添加的自定义声明创建JWT... 查看详情

如何在没有 ASP.NET 的情况下从 json 客户端调用 .NET AuthenticationService

】如何在没有ASP.NET的情况下从json客户端调用.NETAuthenticationService【英文标题】:HowtoCall.NETAuthenticationServicefromjsonclientwithoutASP.NET【发布时间】:2012-02-1315:44:10【问题描述】:我有一个WCF4服务,它位于Secure子文件夹中,可在客户端... 查看详情

wcf与相互身份验证(代码片段)

...返回401Unauthorized。我已经阅读了几篇关于如何在WCF中编写客户端和服务器部分以使用相互身份验证的文章,但我仍然有以下问题:客户端发送客户端证书后,WCF服务如何确定是否将其接受为具有访问给定资源的经过身份验证的端... 查看详情