我正在尝试在快速服务器中实现中间件,该服务器在传入请求上设置自定义uid / admin标头。然后,在中间件之后使用此修改后的请求,以查看经过身份验证的用户/管理员是否正在访问该特定资源。
要为客户端执行此操作,我只需获取Authorization标头上的令牌并将其提供给firebase admin api的verifyIdToken方法。如果存在uid,我设置标题。例如:
app.use((req, res, next) => {
/* get rid of headers sent in by malicious users. */
delete req.headers._uid;
try {
const token = req.headers.authorization.split(' ')[1];
_dps.fb_admin.auth().verifyIdToken(token).then(claims => {
if (claims.uid) { req.headers._uid = claims.uid; }
next();
}).catch(err => next());
} catch(err) { next(); }
});
两个问题:
1)作为在另一台服务器上拥有服务帐户的管理员,我如何向该服务器发送请求,以便该服务器可以确定管理员发送了该请求?
2)我如何识别此服务器上的管理员?
答案 0 :(得分:0)
您需要创建自己的自定义Firebase令牌,以在JWT中包含isAdmin: true
等自定义字段。请参阅https://firebase.google.com/docs/auth/admin/create-custom-tokens
见(1)
答案 1 :(得分:0)
使用setCustomUserClaims()
API向所有管理员用户帐户添加特殊的“管理员”声明,并在验证ID令牌时进行检查。你可以找到这个用例here的讨论和演示(跳到录音的6:45标记)。
答案 2 :(得分:0)
也许解决方案是简单地生成一个体面长度的API密钥,并将其设置为每个服务器上的环境变量。然后我可以在Authorization标头中发送它,只要我想发一个admin https请求,并通过一个简单的字符串比较在接收器的中间件中验证它。唯一可以看到此API密钥的人是可以访问我的服务器的人(AKA管理员)。如果这种方法有问题,请告诉我。这看起来很简单。