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

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

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

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

【问题讨论】:

    标签: firebase firebase-authentication firebase-admin


    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2012-04-15
      • 2018-10-06
      • 2010-10-16
      相关资源
      最近更新 更多