我需要使用节点对Firebase用户进行身份验证,以便测试一些服务器端方法。对于每个受保护的请求,我使用以下方式验证Firebase令牌:
firebase.auth().verifyIdToken(firebaseAccessToken).then(function(decodedToken) {
// forward request
})
所以在我的测试中,我从我的Firebase数据库中创建了一个带有uid的令牌
firebase.auth().createCustomToken(uid).then(function(token) {
//add to header for requests
})
后来我读到自定义令牌不通过verifyIdToken方法验证,只有客户端生成的令牌。
我看了这个答案-Firebase中令牌的服务器端验证
所以我在init json中添加了数据库AuthVariableOverwrite
firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: [dbURL],
databaseAuthVariableOverride: {
uid: [uid]
}
});
我的测试结果还在
Error: expected 200 "OK", got 401 "Unauthorized"
火力基地的错误-
Error: Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.
那么如何使用我当前的设置模拟用户呢?
以下是用于生成FirebaseID令牌(不是自定义令牌)的Python脚本。
python firebase_token_generator.py <UID>
可能有更简单的方法来做到这一点,但您可以从Node调用Python脚本。
您可以从自定义令牌生成Firebase Id令牌,然后将其用于验证。例如:
const rp = require("request-promise");
// 'customToken' comes from FirebaseAdmin.auth().createCustomToken(uid)
function getIdTokenFromCustomToken(customToken) {
const url = `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=${API_KEY}`;
const data = {
token: customToken,
returnSecureToken: true
};
var options = {
method: "POST",
uri: url,
body: data,
json: true // Automatically stringifies the body to JSON
};
return rp(options)
// idToken is the firebase id token that can be used with verifyIdToken
.then(parsedBody => parsedBody.idToken)
.catch(function(err) {
// POST failed...
});
}