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

时间:2019-11-10 11:42:32

标签: javascript firebase firebase-authentication firebase-admin

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

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

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

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

我知道我可以通过电子邮件获取用户,但是由于相应的方法再次仅在客户端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));
    })

1 个答案:

答案 0 :(得分:3)

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

  

Create Custom Token

     

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

     

要实现此目的,必须创建一个接受登录凭据(例如用户名和密码 )的服务器终结点,如果凭据有效,则返回定制的JWT。然后,客户端设备可以使用从服务器返回的自定义JWT进行Firebase(iOSAndroidweb)的身份验证。

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

admin.auth().createCustomToken(uid)

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

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

  1. 使用Firebase Auth REST API来Sign in with email / password
  2. 身份验证成功后,请使用Firebase Admin SDK方法getUserByEmail
  3. Firebase Admin SDK UserRecord将包含uid,然后可以将其传递给admin.auth().createCustomToken(uid)