【问题标题】:Google Cloud Function with Basic Auth not working properly具有基本身份验证的 Google Cloud 功能无法正常工作
【发布时间】:2020-03-17 02:54:58
【问题描述】:

React 客户端代码 - 使用请求承诺在 Header 中发送用户名和密码

var password = values.password;
  var email = values.email;
request
        .head(
          "https://us-central1-simplineet-754e8.cloudfunctions.net/CreateUserAuth"
        )
        .set('Content-Type', 'application/x-www-form-urlencoded')
        .auth(email, password, false)
        .query(dataobj)
        .then(res => {
          console.log(res);
          if (res.statusCode === 200) {
            console.log("statusText",res.body);

          } else {
            console.log("statusText",res.statusText);

          }
        })
        .catch(err => {});

后端 - 用于处理来自客户端的基本身份验证请求的 Google Cloud 功能

   const express = require('express');
    const app = express();
    const cors = require('cors');
    app.use(cors({origin: true}));

    exports.CreateUserAuth = functions.https.onRequest((request, response) => {
     var corsFn = cors();
     corsFn(request, response, function ()  {
        // Request Header
            response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
            response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
            response.setHeader('Access-Control-Allow-Credentials', true);
            response.setHeader('Access-Control-Allow-Origin', '*');


        var auth = require('basic-auth') // basic-auth NPM  package to extract username and password from header
        var user = auth(request)  
        var email = user.name; // Getting username from Auth
        var password = user.pass; // Getting password from Auth
        var username = request.query.username;

        response.send('Hello from Firebase!');  // Not getting this response in Client 
     });

    });

响应进入客户端:

Response {req: Request, xhr: XMLHttpRequest, text: null, statusText: "", statusCode: 200, …}

【问题讨论】:

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


    【解决方案1】:

    根据MDN docs,HEAD 响应不应有正文:

    如果使用 HTTP GET 方法请求指定的资源,则 HTTP HEAD 方法会请求返回的标头。例如,可以在决定下载大型资源以节省带宽之前完成此类请求。

    对 HEAD 方法的响应不应该有正文。如果是这样,它必须被忽略。即便如此,描述正文内容的实体标头(如 Content-Length)也可能包含在响应中。它们与应该为空的 HEAD 响应的正文无关,但与使用 GET 方法的类似请求的正文将作为响应返回。

    我的猜测是 GCP 将其作为 GET 处理并在返回响应之前剥离正文。 但是,请记住,Google Cloud Functions HTTP trigger docs 并未明确表示 HEAD 是受支持的方法:

    您可以使用 POST、PUT、GET、DELETE 和 OPTIONS HTTP 方法通过 HTTP 请求调用 Cloud Functions。

    【讨论】:

      【解决方案2】:

      看起来您正在发出 HEAD 请求而不是 POST 请求。更改为request.post(),它应该可以工作

      【讨论】:

      • 是的,它在 POST 请求中运行良好,我只在使用 HEAD 请求时遇到问题 @Olivier Lépine
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2021-04-24
      • 2014-11-17
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多