如何创建通过Firebase Cloud Functions托管的Node.js代理服务器?

jpl*_*s93 6 node.js firebase google-cloud-functions

我有一个使用YouTube API密钥的应用程序,可以在YouTube上搜索视频并将其显示在我的页面上。我刚刚了解到,将任何秘密公开给客户端都是不好的。因此,我正在考虑的解决方案是让客户端将请求发送到Firebase云功能。云功能将充当代理,我的API密钥将存储在该代理中,而不是将其存储在客户端中。

如何设置?

对于初学者,我尝试记录该request对象,但收到一条神秘的错误消息。

error: SUPERVISOR clientError { Error: Parse Error bytesParsed: 0, code: 'HPE_INVALID_METHOD' } connecting=false, _hadError=false, bytesRead=193, , fd=
-1, reading=true, $ref=$, onread=function onread(nread, buffer) {
Run Code Online (Sandbox Code Playgroud)

GET是产生上述错误消息的客户端发送的请求

https://localhost:5000/jpls-youtube-viewer/us-central1/helloWorld?part=snippet&type=video&q=Linkin+Park
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序的仓库:https : //github.com/jpls93/jpls-youtube-viewer

这是托管网站:https : //jpls-youtube-viewer.firebaseapp.com/

jpl*_*s93 4

我通过将客户端请求指向我的 Firebase 数据库 URL 来解决这个问题,然后让 Firebase 数据库 URL 向 YouTube REST API URL 发出请求,并将响应解析给我的客户端。我遇到了 CORS 问题,但通过允许 access-control-origin/methods 就可以解决这个问题

exports.helloWorld = functions.https.onRequest((request, response) => {
  var term = request.query.q;
  // See https://howtofirebase.com/firebase-cloud-functions-753935e80323
  // why we're requiring it inside the function
  var YT_URL = "https://www.googleapis.com/youtube/v3/search";
  const axios = require("axios");
  axios
    .get(YT_URL, {
      params: {
        part: "snippet",
        type: "video",
        key: require("./secret"),
        q: term
      }
    })
    .then(YouTubeData => {
      response.set("Access-Control-Allow-Origin", "*");
      response.set("Access-Control-Allow-Methods", "GET, POST");
      response.status(200).send(YouTubeData.data.items);
    })
    .catch(err => console.error(err));
});
Run Code Online (Sandbox Code Playgroud)

  • 现在,任何人都不能只使用您的代理而不是为自己获取 YouTube 密钥吗? (3认同)