获取访问令牌以认证Firebase函数中的API

时间:2018-08-16 05:53:29

标签: firebase firebase-authentication google-cloud-functions

我已经在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');
        });
    };

1 个答案:

答案 0 :(得分:0)

您的用例将是两种身份验证的组合。

对于Angular App,您将拥有经过身份验证的用户,因此您可以直接使用sdk写入数据库。

对于您提到的Java客户端,您将没有Firebase身份验证,但仍需要以已身份验证的方式调用api。

我建议您在功能端点上跳过Firebase身份验证,而应使用JWT令牌作为身份验证。该令牌将一次生成并存储在您的JAVA客户端(假设它是服务器)中。每次java发送请求时,客户端都会将此编码令牌作为承载发送。然后,您的身份验证层只需用户JWT解码即可,而不是firebase id令牌。

步骤:

  1. 使用库https://github.com/auth0/node-jsonwebtoken
  2. 生成JWT令牌
  3. 在Firebase配置中保留JWT创建令牌。
  4. 将生成的JWT令牌存储在JAVA环境中并且安全。
  5. Firebase中的
  6. 身份验证层将变为:

    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();
      });
    
    };
    

由于服务器到服务器的通信,您将丢失用户信息。

相关问题