我已经在Firebase函数中编写了需要访问令牌的API,它已经与我使用angular Web应用程序生成的令牌一起使用。但是第三方服务(JAVA)需要访问此API,
问题是如何从另一个JAVA应用程序生成访问令牌以在firebase函数中访问此API。
const admin = require('firebase-admin');
admin.initializeApp(functions.config.firebase);
app.use(validateFirebaseIdToken);
validateFirebaseIdToken方法中的代码块,用于verifyIDToken。 (此方法用于验证所有端点的身份)
const validateFirebaseIdToken = (req, res, next) => {
.....
.......
.....
idToken = req.headers.authorization.split('Bearer ')[1];
.....
.......
.....
admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
console.log('ID Token correctly decoded', decodedIdToken);
req.user = decodedIdToken;
return next();
}).catch((error) => {
console.error('Error while verifying Firebase ID token:', error);
res.status(403).send('Unauthorized');
});
};
答案 0 :(得分:0)
您的用例将是两种身份验证的组合。
对于Angular App,您将拥有经过身份验证的用户,因此您可以直接使用sdk写入数据库。
对于您提到的Java客户端,您将没有Firebase身份验证,但仍需要以已身份验证的方式调用api。
我建议您在功能端点上跳过Firebase身份验证,而应使用JWT令牌作为身份验证。该令牌将一次生成并存储在您的JAVA客户端(假设它是服务器)中。每次java发送请求时,客户端都会将此编码令牌作为承载发送。然后,您的身份验证层只需用户JWT解码即可,而不是firebase id令牌。
步骤:
身份验证层将变为:
const validateIdToken = (req, res, next) => {
idToken = req.headers.authorization.split('Bearer ')[1];
jwt.verify(token, 'YOUR_SECRET', function(err, decoded) {
if (err){
console.error('Error while verifying ID token:', err);
return res.status(403).send('Unauthorized');
}
console.log(decoded) // bar
return next();
});
};
由于服务器到服务器的通信,您将丢失用户信息。