Javascript 在firebase云函数中使用express`app.get()`访问文件

Javascript 在firebase云函数中使用express`app.get()`访问文件,javascript,firebase,express,google-cloud-functions,Javascript,Firebase,Express,Google Cloud Functions,我尝试将Firebase主机与Firebase函数结合使用,以便只有具有有效Firebase令牌的用户才能访问.html内容 访问Firebase主机时,我能够在iOS应用程序中发送令牌,我的云函数被调用并成功解码令牌(我在Firebase函数日志中看到“ID令牌正确解码”) 然后应该打开index.html,它位于我的/functions文件夹的子文件夹(/myhomepage)中(因此不在“/public”中) 我的应用程序浏览器中总是出现错误:“无法获取/” Firebase函数日志显示:

我尝试将Firebase主机与Firebase函数结合使用,以便只有具有有效Firebase令牌的用户才能访问.html内容

访问Firebase主机时,我能够在iOS应用程序中发送令牌,我的云函数被调用并成功解码令牌(我在Firebase函数日志中看到“ID令牌正确解码”)

然后应该打开index.html,它位于我的/functions文件夹的子文件夹(/myhomepage)中(因此不在“/public”中)

我的应用程序浏览器中总是出现错误:“无法获取/”

Firebase函数日志显示:“函数执行耗时1654毫秒,完成状态代码:404”

index.js中的代码:

const admin = require("firebase-admin");
const functions = require('firebase-functions');
const express = require('express');
const cookieParser = require('cookie-parser')();
const cors = require('cors')({origin: true});
const app = express();

admin.initializeApp();

let db = admin.firestore();

// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header.
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this:
// `Authorization: Bearer <Firebase ID Token>`.
// when decoded successfully, the ID Token content will be added as `req.user`.
const validateFirebaseIdToken = async (req, res, next) => {
  functions.logger.log('Check if request is authorized with Firebase ID token');

  if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
      !(req.cookies && req.cookies.__session)) {
    functions.logger.error(
      'No Firebase ID token was passed as a Bearer token in the Authorization header.',
      'Make sure you authorize your request by providing the following HTTP header:',
      'Authorization: Bearer <Firebase ID Token>',
      'or by passing a "__session" cookie.'
    );
    res.status(403).send('Unauthorized');
    return;
  }

  let idToken;
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
    functions.logger.log('Found "Authorization" header');
    // Read the ID Token from the Authorization header.
    idToken = req.headers.authorization.split('Bearer ')[1];
  } else if(req.cookies) {
    functions.logger.log('Found "__session" cookie');
    // Read the ID Token from cookie.
    idToken = req.cookies.__session;
  } else {
    // No cookie
    res.status(403).send('Unauthorized');
    return;
  }

  try {
    const decodedIdToken = await admin.auth().verifyIdToken(idToken);
    functions.logger.log('ID Token correctly decoded', decodedIdToken);
    req.user = decodedIdToken;
    next();
    return;
  } catch (error) {
    functions.logger.error('Error while verifying Firebase ID token:', error);
    res.status(403).send('Unauthorized');
    return;
  }
};

app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);
app.get('/myhomepage', (req, res) => { // <-- The problem seems to be here
    functions.logger.log('Calling get.'); // This line does not get called in my log.
    res.status(200).sendFile('/index.html');
});

exports.myfunction = functions.https.onRequest(app);
const admin=require(“firebase管理员”);
const functions=require('firebase-functions');
const express=require('express');
const cookieParser=require('cookie-parser')();
const cors=require('cors')({origin:true});
常量app=express();
admin.initializeApp();
设db=admin.firestore();
//验证在授权HTTP头中传递的Firebase ID令牌的Express中间件。
//Firebase ID令牌需要作为承载令牌在授权HTTP头中传递,如下所示:
//“授权:持票人”。
//解码成功后,ID令牌内容将添加为“req.user”。
const VALIDATEFIREASEIDTOKEN=异步(请求、恢复、下一步)=>{
functions.logger.log('检查请求是否使用Firebase ID令牌授权');
if((!req.headers.authorization | |!req.headers.authorization.startsWith('Bearer'))&&
!(请求cookies和请求cookies.\uuu会话)){
函数.logger.error(
“没有在授权标头中将Firebase ID令牌作为承载令牌传递。”,
'请确保通过提供以下HTTP标头来授权您的请求:',
“授权:持票人”,
'或通过传递“\u会话”cookie。”
);
res.status(403).发送(“未授权”);
返回;
}
让idToken;
if(req.headers.authorization&&req.headers.authorization.startsWith('Bearer')){
functions.logger.log('Found“Authorization”header');
//从授权标头读取ID令牌。
idToken=req.headers.authorization.split('Bearer')[1];
}else if(请求cookies){
functions.logger.log('Found“_session”cookie”);
//从cookie中读取ID令牌。
idToken=请求cookies.\uuuu会话;
}否则{
//没有饼干
res.status(403).发送(“未授权”);
返回;
}
试一试{
const decodedIdToken=wait admin.auth().verifyIdToken(idToken);
functions.logger.log('ID Token正确解码',decodedIdToken);
req.user=decodedIdToken;
next();
返回;
}捕获(错误){
functions.logger.error('验证Firebase ID令牌时出错:',错误);
res.status(403).发送(“未授权”);
返回;
}
};
应用程序使用(cors);
应用程序使用(cookieParser);
应用程序使用(ValidateFireBaisedToken);

app.get('/myhomepage',(req,res)=>{/通常,您只能使用
send()
redirect()
end()
结束HTTP函数,请参阅


我从未尝试过,但我认为使用
sendFile()
不起作用。如果要将用户重定向到通过Firebase主机提供的静态页面,应使用
redirect()
。另一种可能是将HTML字符串传递到
send())
方法,请参阅。

谢谢您的提示,但是如何重定向到“/functions/myhomepage/”中的静态文件?它不是“public”中的静态文件通过Firebase托管目录。您不能通过托管存储在用于云功能的
函数
目录下的文件来提供服务。您可以将其托管在
公共
目录下(但它是“公共的”,即任何人都可以访问它),或者在云函数中生成一些HTML,然后通过
send()将其发送回
:这是一个。@Kuhlemann您是否能够通过在Firebase函数中动态生成主页来访问您的主页?如果是这样,我希望您将此解决方案作为答案发布并接受它。此措施提高了未来用户寻找类似答案的可见性。提前感谢!很遗憾,我无法访问ss静态内容可靠,位于函数/子文件夹内。有时有效,有时我收到GET错误。也许函数文件夹不适合主页托管,但如果我想在分发这些文件之前运行权限检查,我看不到其他地方。