我有一个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));
})
答案 0 :(得分:3)
由于文档指出:使用Firebase Admin SDK根据登录凭据创建自定义令牌会令人困惑,
Create Custom Token
Firebase通过允许您使用安全的JSON Web令牌(JWT)对用户或设备进行身份验证,使您可以完全控制身份验证。您可以在服务器上生成这些令牌,然后将其传递回客户端设备,然后通过
signInWithCustomToken()
方法使用它们进行身份验证。要实现此目的,必须创建一个接受登录凭据(例如用户名和密码 )的服务器终结点,如果凭据有效,则返回定制的JWT。然后,客户端设备可以使用从服务器返回的自定义JWT进行Firebase(iOS,Android,web)的身份验证。
有一个基于用户的Firebase uid
创建自定义令牌的示例:
admin.auth().createCustomToken(uid)
但是文档没有首先显示如何验证用户凭据是否有效。
由于Firebase Admin SDK不提供用于验证凭据的方法,因此解决方法是结合使用Firebase Admin SDK和Firebase Auth REST API。
getUserByEmail
UserRecord
将包含uid
,然后可以将其传递给admin.auth().createCustomToken(uid)