提问者:小点点

使用NodeJS进行Firebase身份验证


到目前为止,我一直在使用MongoDB和Express。在那里,我的整个身份验证都是通过检查req. user对象来完成的。据我所见,Firebase身份验证主要是在前端完成的。我如何让req.user在后端使用Firebase?我看了几个教程,但它们只是展示了几个方法,然后继续。我的意思是询问更多关于逻辑的信息,但一些代码示例可能会有所帮助。


共2个答案

匿名用户

Firebase鉴权多在前端完成

正确。使用Firebase提供的SDK时,用户身份验证完全在客户端完成。

但是,如果您需要执行一些特殊的身份验证,例如与LDAP/AD集成或其他一些企业恶作剧,那么您将需要执行客户端SDK用于对用户进行身份验证的自定义令牌创建。

如何让req. user在后端使用Firebase?

这是您需要自己实现的东西。流客户端将类似于:

  • 用户在客户端执行身份验证。
    • Firebase将默认在localstore中设置身份验证状态。请参阅身份验证状态持久性

    假设您将令牌附加在请求标头上:FIREBASE_AUTH_TOKEN: abc。请参阅Firebase检索存储在本地存储中的用户数据,作为Firebase:autUser:

    因此,在服务器端,使用Firebase AdminSDK,您将检索该令牌并通过valfyIdToken对其进行验证。下面是中间件的快速脏例子:

    const {auth} = require('firebase-admin');
    const authService = auth();
    
    exports.requiresAuth = async (req, res, next) => {
        const idToken = req.header('FIREBASE_AUTH_TOKEN');
    
        // https://firebase.google.com/docs/reference/admin/node/admin.auth.DecodedIdToken
        let decodedIdToken;
    
        try {
            decodedIdToken = await authService.verifyIdToken(idToken);
        } catch (error) {
            next(error);
            return;
        }
    
        req.user = decodedIdToken;
        next();
    }
    

    然后,您将像这样使用这个中间件:

    const express = require('express');
    const router = express.Router();
    const {requiresLogin} = require('./my-middleware.js');
    
    router.get('/example', requiresLogin, async (req, res) => {
        console.log(req.user)
    })
    

    我希望这能让你知道该怎么做。我已经有一段时间没有使用Firebase了,上面的信息是我通过查看留档收集的。

匿名用户

如果您计划仅使用服务器端会话,则应考虑使用Firebase会话cookie:https://firebase.google.com/docs/auth/admin/manage-sessions.

有一个示例可以显示如何使用httpOnlycookie:https://github.com/firebase/quickstart-nodejs/tree/master/auth-sessions