具有基本身份验证的Google Cloud Function无法正常工作

问题描述 投票:0回答:2

React Client Code-使用请求承诺在标题中发送用户名和密码

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 Function处理来自客户端的基本身份验证请求

   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 cors google-cloud-functions firebase-security-rules
2个回答
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。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.