繁体   English   中英

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

[英]Firebase: How to generate access token from username and password on the server?

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

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

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

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

我知道我可以通过 email 获取用户,但是我如何检查密码,因为相应的方法再次仅在客户端 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));
    })

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

创建自定义令牌

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

为此,您必须创建一个接受登录凭据(例如用户名和密码)的服务器端点,如果凭据有效,则返回自定义 JWT。 The custom JWT returned from your server can then be used by a client device to authenticate with Firebase ( iOS , Android , web ).

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

admin.auth().createCustomToken(uid)

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

Since the Firebase Admin SDK does not provide methods for verifying credentials, a work around is to use a combination of the Firebase Admin SDK as well as the Firebase Auth REST API.

  1. 使用 Firebase Auth REST API 登录 Z0C83F57C786A0B4A39EFAB2373
  2. 验证成功后,使用 Firebase Admin SDK 方法getUserByEmail
  3. Firebase Admin SDK UserRecord将包含uid ,然后可以将其传递给admin.auth().createCustomToken(uid)

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

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

然后你可以在 HTTP header 中传递这个令牌作为Bearer令牌在服务器端,你可以只使用来自管理员verifyToken

FirebaseAuth.getInstance().verifyIdToken(token)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM