Cloud Functions for Firebase 的安全 HTTP 触发器

Posted

技术标签:

【中文标题】Cloud Functions for Firebase 的安全 HTTP 触发器【英文标题】:Secure HTTP trigger for Cloud Functions for Firebase 【发布时间】:2017-08-31 12:08:44 【问题描述】:

有没有办法在触发云功能之前检查用户是否获得了 Firebase 授权? (或函数内)

【问题讨论】:

How to protect firebase Cloud Function HTTP endpoint to allow only Firebase authenticated users?的可能重复 【参考方案1】:

是的。您需要将 Firebase ID 令牌与请求一起发送(例如在 AJAX 请求的 Authorization 标头中),然后使用 Firebase Admin SDK 对其进行验证。 Cloud Functions for Firebase 示例存储库中有一个 in-depth example。它看起来像这样(SO 帖子更短):

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')();

const validateFirebaseIdToken = (req, res, next) => 
  cors(req, res, () => 
    const idToken = req.headers.authorization.split('Bearer ')[1];
    admin.auth().verifyIdToken(idToken).then(decodedIdToken => 
      console.log('ID Token correctly decoded', decodedIdToken);
      req.user = decodedIdToken;
      next();
    ).catch(error => 
      console.error('Error while verifying Firebase ID token:', error);
      res.status(403).send('Unauthorized');
    );
  );
;

exports.myFn = functions.https.onRequest((req, res) => 
  validateFirebaseIdToken(req, res, () => 
    // now you know they're authorized and `req.user` has info about them
  );
);

【讨论】:

嗨@michael-bleigh,有没有办法使用firebase admin sdk验证来自我们服务器的调用? 有没有可能得到cors的承诺?如果我们没有返回一个 Promise,函数就会被杀死。【参考方案2】:

由于问题要求(1)在函数内或(2)函数内进行基于身份验证的访问,因此这里是“之前”情况的一种方法:>

由于每个 Firebase 项目也是一个 Google Cloud 项目 - GCP 允许“私有”功能,您可以设置项目范围或每个功能的权限外部函数,以便只有经过身份验证的用户才能触发该函数。

未经授权的用户将在函数调用前被拒绝,即使他们尝试访问端点。

这是关于 setting permissions 和 authenticating users 的文档。在撰写本文时,我相信使用此方法需要用户拥有 Google 帐户才能进行身份验证。

【讨论】:

我遇到了麻烦,我设置为允许来自经过身份验证的用户调用,但在测试时仍然获得 http 403,你确定这些功能是这样工作的吗?

以上是关于Cloud Functions for Firebase 的安全 HTTP 触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud Functions 测试中模拟 FCM admin.messaging().sendToDevice() 的实现

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

Cloud Functions for Firebase 超时

Cloud Functions for Firebase onWrite 超时

在 Cloud Functions for Firebase 中访问 db 数据

Cloud Functions for Firebase 组织