Firebase:如何从服务器上的用户名和密码生成访问令牌?

vir*_* us 1 javascript firebase firebase-authentication firebase-admin

我有一个 Firebase 应用程序,我正在集成 Zapier。他们要求用户通过他们的表单对我的应用程序进行身份验证。

它的工作方式是 Zapier 将向用户请求电子邮件和密码,并将其发送到我的端点以获取访问令牌并将其用于任何进一步的请求。

我不太清楚如何从服务器(节点 js)上的用户名和密码生成访问令牌,因为所有身份验证方法都存在于客户端 SDK 中。

到目前为止,我希望使用提供的电子邮件/密码对用户进行身份验证,从他们生成自定义令牌uid并将其发送回 Zapier。但我不能这样做,因为signInWithEmailAndPassword服务器 SDK 中没有或类似的方法。

我知道我可以通过电子邮件获取用户,但是我如何检查密码,因为相应的方法再次仅在客户端 SDK 中可用?

到目前为止,我有以下代码:

const rp = require('request-promise');

app.post('/api/integrations/zapier/auth', (req, res) => {
        let data = req.body
        admin.auth().signInWithEmailAndPassword(data.email, data.password) // <- this method doesn't exist in the server sdk
            .then(response => admin.auth().createCustomToken(response.user.id))
            .then(customToken => rp({
                url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=${config.apiKey}`,
                method: 'POST',
                body: {
                    token: customToken,
                    returnSecureToken: true
                },
                json: true,
            }))
            .then(idToken => {
                res.send({
                    accessToken: idToken,
                    filed: data.email
                });
            }).catch(error => res.status(500).send(error));
    })
Run Code Online (Sandbox Code Playgroud)

Chr*_*ert 5

使用 Firebase Admin SDK 基于登录凭据创建自定义令牌令人困惑,因为文档指出:

创建自定义令牌

Firebase 允许您使用安全的 JSON 网络令牌 (JWT) 对用户或设备进行身份验证,从而让您完全控制身份验证。您在服务器上生成这些令牌,将它们传回客户端设备,然后使用它们通过该signInWithCustomToken()方法进行身份验证。

为此,您必须创建一个接受登录凭据(例如用户名和密码)的服务器端点,并且如果凭据有效,则返回自定义 JWT。然后,客户端设备可以使用从服务器返回的自定义 JWT 对 Firebase( iOS Android web)进行身份验证。

有一个基于用户的 Firebase 创建自定义令牌的示例uid

admin.auth().createCustomToken(uid)
Run Code Online (Sandbox Code Playgroud)

但是文档没有显示如何首先验证用户凭据是否有效。

由于 Firebase Admin SDK 不提供验证凭据的方法,解决方法是结合使用 Firebase Admin SDK 和 Firebase Auth REST API。

  1. 使用 Firebase Auth REST API使用电子邮件/密码登录
  2. 身份验证成功后,使用 Firebase Admin SDK 方法 getUserByEmail
  3. Firebase Admin SDKUserRecord将包含uid,然后可以将其传递给admin.auth().createCustomToken(uid)