2017-10-08 120 views
1

我有一个使用节点admin sdk连接并调用firebase的API。我的客户为我们所需要的所有事情打了个响。我不希望他们必须直接致电firebase进行身份验证,因为我希望客户端代码与api和后端解耦。如何在没有客户端身份验证的情况下从服务器验证Firebase用户?

服务器如何验证它们?根据目前的文档,即使在最低限度的客户端也必须提供他们的aid(假设他们自己进行身份验证,对吧?)。

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

回答

3

如果您想使用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。根据您的使用情况,这可能是具有成本效益的选项。

+0

谢谢,很酷,我们可以在服务器上运行客户端库,如果需要的话。我现在要将会话管理保留在客户端中,并看看我能够使用该设置获得多少。 – Brian

相关问题