Yuvaraj M
Yuvaraj M

Reputation: 311

Google Cloud Function with Basic Auth not working properly

React Client Code - Using request promises to send username and password in 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 => {});

Backend - Google Cloud Function to Handle Basic Auth Requests from Client

   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 Getting in Client :

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

Upvotes: 0

Views: 1249

Answers (2)

Riccardo Biraghi
Riccardo Biraghi

Reputation: 131

As per MDN docs, HEAD responses should not have a body:

The HTTP HEAD method requests the headers that are returned if the specified resource would be requested with an HTTP GET method. Such a request can be done before deciding to download a large resource to save bandwidth, for example.

A response to a HEAD method should not have a body. If so, it must be ignored. Even so, entity headers describing the content of the body, like Content-Length may be included in the response. They don't relate to the body of the HEAD response, which should be empty, but to the body of similar request using the GET method would have returned as a response.

My guess is that GCP is handling it as a GET and stripping out the body before returning a response. However, keep in mind that Google Cloud Functions HTTP trigger docs don't explicitly say that HEAD is a supported method:

You can invoke Cloud Functions with an HTTP request using the POST, PUT, GET, DELETE, and OPTIONS HTTP methods.

Upvotes: 2

Olivier Lépine
Olivier Lépine

Reputation: 668

It looks like you are making a HEAD request instead of a POST request. Change to request.post() and it should work

Upvotes: 0

Related Questions