如何在处理其余请求之前验证 Firebase AuthToken
How to validate Firebase AuthToken before handling the rest of the request
我有一个 NodeJS 服务器,它接受包含 Firebase
令牌、phone 数字和文件的表单数据。
我正在使用 busboy
和 express
从表单中获取数据。
代码如下所示:
function validateAuthToken(authToken) {
if (authToken) {
admin.auth().verifyIdToken(authToken).then(function(decodedToken) {
console.log("Verified auth token uid is:" + decodedToken.user_id);
return decodedToken;
}).catch(function(error) {
console.log("Failed to verify authToken with error:" + error);
});
}
}
}
app.post("/shout", function(req, res) {
var busboy = new Busboy({ headers: req.headers });
busboy.on('field', function(fieldName, value) {
var decodedToken = null;
var recPhone = null;
switch (fieldName) {
case constants.MSG_FORM_PART_AUTH_TOKEN:
decodedToken = validateAuthToken(value);
break;
case constants.MSG_FORM_PART_RECIPIENT_PHONE:
//validate the phone number only if the token is valid
recPhone = validatePhoneNumber(decodedToken.phone_number, value);
break;
}
});
busboy.on('file', function(fieldName, file) {
shoutFileName = path.join(constants.SHOUT_FILES_PATH, shortid.generate());
file.pipe(fs.createWriteStream(shoutFileName));
});
busboy.on('finish', function() {
//save the file if the token is valid
});
return req.pipe(busboy);
});
我的问题是我需要先完成令牌验证,然后才能验证 phone 号码或将文件保存到服务器。
verifyIdToken
使用 promise 来验证 Firebase 令牌,因此我不能对其使用 await。同时 busboy
继续解析请求的其余部分。
如何序列化流程?
我是否应该保存所有数据并仅在 busboy
完成事件发出后才开始验证?
在没有得到答案并与开发人员离线聊天后,我实施了 busboy
完成事件。
我首先将文件保存到 TMP 文件夹中。然后我验证了令牌,只有在获得验证结果后才继续将文件保存到永久位置。
这样做的缺点是,如果验证失败,我无法阻止保存大文件,但由于我以任何方式将文件限制为较小,因此这是一种更好的直接方法。
我有一个 NodeJS 服务器,它接受包含 Firebase
令牌、phone 数字和文件的表单数据。
我正在使用 busboy
和 express
从表单中获取数据。
代码如下所示:
function validateAuthToken(authToken) {
if (authToken) {
admin.auth().verifyIdToken(authToken).then(function(decodedToken) {
console.log("Verified auth token uid is:" + decodedToken.user_id);
return decodedToken;
}).catch(function(error) {
console.log("Failed to verify authToken with error:" + error);
});
}
}
}
app.post("/shout", function(req, res) {
var busboy = new Busboy({ headers: req.headers });
busboy.on('field', function(fieldName, value) {
var decodedToken = null;
var recPhone = null;
switch (fieldName) {
case constants.MSG_FORM_PART_AUTH_TOKEN:
decodedToken = validateAuthToken(value);
break;
case constants.MSG_FORM_PART_RECIPIENT_PHONE:
//validate the phone number only if the token is valid
recPhone = validatePhoneNumber(decodedToken.phone_number, value);
break;
}
});
busboy.on('file', function(fieldName, file) {
shoutFileName = path.join(constants.SHOUT_FILES_PATH, shortid.generate());
file.pipe(fs.createWriteStream(shoutFileName));
});
busboy.on('finish', function() {
//save the file if the token is valid
});
return req.pipe(busboy);
});
我的问题是我需要先完成令牌验证,然后才能验证 phone 号码或将文件保存到服务器。
verifyIdToken
使用 promise 来验证 Firebase 令牌,因此我不能对其使用 await。同时 busboy
继续解析请求的其余部分。
如何序列化流程?
我是否应该保存所有数据并仅在 busboy
完成事件发出后才开始验证?
在没有得到答案并与开发人员离线聊天后,我实施了 busboy
完成事件。
我首先将文件保存到 TMP 文件夹中。然后我验证了令牌,只有在获得验证结果后才继续将文件保存到永久位置。 这样做的缺点是,如果验证失败,我无法阻止保存大文件,但由于我以任何方式将文件限制为较小,因此这是一种更好的直接方法。