如何在没有客户端身份验证的情况下从服务器验证 firebase 用户?
How to authenticate a firebase user from server without client side auth?
我有一个 API,它使用节点管理 sdk 连接并调用 firebase。我的客户点击我的 api 以获得他们需要的所有东西。我不希望他们不得不调用 firebase 直接进行身份验证,因为我希望客户端代码与 api 和后端分离。
服务器如何验证它们?基于当前的文档,即使是最低限度,客户端也必须向 api 提供他们的 uid(假设他们自己进行了身份验证,对吗?)。
理想情况下,客户端将通过 ssl 在 POST 的正文中向我的 api 提供用户名和密码,然后 api 将让他们登录并发回他们的 ID 令牌.推荐的方法是什么?
如果要使用Firebase 进行身份验证,最好在客户端通过客户端SDK 进行处理。这是因为身份验证是基于 IP 地址的速率限制,它还允许您跳过会话管理和持久性中的编码过程。
但是,如果您希望 logins/users 数量较少,则可以通过在您的服务器上托管客户端 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 放在一起。根据您的用例,这可能是具有成本效益的选择。
只是想提供更新:可以在此处找到未记录的 REST API 的答案:
如果可以的话,我会把它标记为答案。
我有一个 API,它使用节点管理 sdk 连接并调用 firebase。我的客户点击我的 api 以获得他们需要的所有东西。我不希望他们不得不调用 firebase 直接进行身份验证,因为我希望客户端代码与 api 和后端分离。
服务器如何验证它们?基于当前的文档,即使是最低限度,客户端也必须向 api 提供他们的 uid(假设他们自己进行了身份验证,对吗?)。
理想情况下,客户端将通过 ssl 在 POST 的正文中向我的 api 提供用户名和密码,然后 api 将让他们登录并发回他们的 ID 令牌.推荐的方法是什么?
如果要使用Firebase 进行身份验证,最好在客户端通过客户端SDK 进行处理。这是因为身份验证是基于 IP 地址的速率限制,它还允许您跳过会话管理和持久性中的编码过程。
但是,如果您希望 logins/users 数量较少,则可以通过在您的服务器上托管客户端 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 放在一起。根据您的用例,这可能是具有成本效益的选择。
只是想提供更新:可以在此处找到未记录的 REST API 的答案:
如果可以的话,我会把它标记为答案。