【问题标题】:Firebase: How to generate access token from username and password on the server?Firebase:如何从服务器上的用户名和密码生成访问令牌?
【发布时间】:2020-03-06 08:51:22
【问题描述】:

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

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

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

到目前为止,我希望使用提供的电子邮件/密码对用户进行身份验证,从他们的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));
    })

【问题讨论】:

    标签: javascript firebase firebase-authentication firebase-admin


    【解决方案1】:

    据我所知,您可以使用 Firebase Flutter 包使用用户名和密码登录。

      var credentials = await auth.signInWithEmailAndPassword(email: email, password: password);
      String token = await credentials.user.getIdToken();
    

    然后您可以在 HTTP 标头中将此令牌作为 Bearer 令牌传递 在服务器端,您可以使用 Admin SDK 中的verifyToken

    FirebaseAuth.getInstance().verifyIdToken(token)
    

    【讨论】:

      【解决方案2】:

      使用 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)

      【讨论】:

      • 感谢克里斯托弗,这似乎是解决方案!以防万一我从链接中粘贴身份验证端点,这样如果他们将文档移动到其他地方就不会丢失:identitytoolkit.googleapis.com/v1/…
      • 对于那些处于类似情况的人来说,虽然我一直在研究集成,但似乎其他应用程序,而不是要求凭据,正在使用 api 令牌进行授权(并要求用户提供他们在 zapier 授权期间),这在这里也可能有意义。只需实现生成此类令牌的相应逻辑以及用户通过令牌查找+撤销它的问题。嗯……为了最好的用户体验,一起实施 oauth2 可能是同样的努力。无论如何,这里只是一个注释
      • 您是否有更多关于人们如何使用 api 令牌进行身份验证的详细信息?任何链接、博客等。
      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      相关资源
      最近更新 更多