Using Passport along with fetch results in the error message "The requested resource did not include the 'Access-Control-Allow-Origin' header."

I am currently working on implementing a button on my website that allows users to authorize access to their YouTube account. I am utilizing Passport for authentication, and my code involves using fetch to send the request. However, when I click on the button, I encounter the following error:

Access to fetch at 'https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fgooglecb&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube&client_id=...' (redirected from 'http://localhost:3000/google') from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

If I use an href to /google it works.

This is what my app.js file looks like:

const appConfig = require('./config.js');
const cors = require('cors')
const express = require('express');
const passport = require('passport');
const path = require('path');
const YoutubeV3Strategy = require('passport-youtube-v3').Strategy;

const index = require('./routes/index');

const app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(cors());

app.use(passport.initialize());
app.use(passport.session());

passport.use(new YoutubeV3Strategy({
  clientID: appConfig.youtube.id,
  clientSecret: appConfig.youtube.secret,
  callbackURL: 'http://localhost:3000/googlecb',
  scope: ['https://www.googleapis.com/auth/youtube'],
},
function (accessToken, refreshToken, profile, cb) {
  const user = {
    accessToken: accessToken,
    refreshToken: refreshToken,
    profile: profile,
  };
  return cb(null, user);
}));

passport.serializeUser((user, cb) => {
  cb(null, user);
});

passport.deserializeUser((obj, cb) => {
  cb(null, obj);
});

app.use('/', index);

app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

In addition, here is how my index.js file is structured:

const express = require('express');
const passport = require('passport');

const router = express.Router();

router.get('/', function(req, res, next) {
  res.render('index');
});

router.get('/google', async (req, res) => {
  passport.authenticate('youtube')(req, res, () => res.send('ok'));
});

router.get('/googlecb', passport.authenticate('youtube'), async (req, res) => {
  const name = req.user.profile.displayName;
  console.log('googlecb name: ' + name);
  return res.send(req.user);
});

module.exports = router;

Lastly, this is the content of my index.ejs file:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p><button id="auth" onclick="go()">Authorize</button><p>
    <p><a href="/google">Authorize</a><p>
    <script> 
async function go() {
  console.log('go');
  await fetch('/google',
    {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    },
  )
  .then(response => {
    console.log('response');
    return response.json();
  })
  .then(data => {
    console.log('data');
  });
}
    </script>
  </body>
</html>

Answer №1

It looks like I have encountered a problem with Passport that needs to be addressed:

https://github.com/jaredhanson/passport/issues/582#issuecomment-506283986

I will make sure to use the href attribute rather than fetch in this case.

Similar issue can be found here:

Cors error when sending request from React frontend to Google Oauth PassportJS on backend

Answer №2

One way to address this issue is by incorporating an anchor tag linked to your backend's specific route. For example, if you have set up

this.router.get("/auth/google", passport.authenticate("google", { scope: ["email", "profile"], successRedirect: "http://localhost:3000" }));
, you can create an anchor tag like so:
<a href="localhost:3000/auth/google>Click here</a>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

What is the best way to incorporate animations for the initial page load?

https://i.sstatic.net/ZwSww.pngIs there a way to add animations during the initial page load in Next Js? I would like to have a series of blocks displayed in gray with a loading animation before the actual content appears. Are there any libraries availab ...

Issue: Unable to locate module - Unable to resolve 'core-js/modules/es.error.cause.js'

I've incorporated Vuexy Dashboard into my project, which utilizes Vue 2. Now, I'm in the process of upgrading it to Vue 3. However, I have encountered an error that has me stuck. Any assistance with this issue would be greatly appreciated. Thank ...

Using Vue.js to create numerous modal popups

Currently, I am using Vue.JS for a research project at my workplace. My focus right now is mainly on the front-end. I have a table with several entries, and when a row is clicked, I want a modal popup window to display further details about that specific ...

Coloring table rows based on results

Recently, I started working with AngularJs and encountered an issue while trying to manipulate JSON data in a specific format: [ { 'StudentName':'abc', 'maths':'0', 'english':'0', ...

The event handler is not defined and is failing to recognize in the React context

Currently, as I delve into the realm of learning React, I find myself facing a perplexing issue regarding the mysterious undefined state of this event handler. Why is it behaving in such an enigmatic manner? const Login = () => { handleSubmit = (e) ...

Issue with React Audio Recorder causing useState hook to return null for recorded audio

I'm currently working on a registration form using React that allows users to enter their username and record audio with the react-audio-voice-recorder library. I've implemented the useState hook to handle the state of the recorded audio blob, bu ...

Creating a website account: Including a pop-up notification for successful account creation using ReactJS

Our fan website currently lacks a proper feedback system for user account creation. Once users complete the process, they are redirected to the front page without any indication of whether the creation was successful or not. To determine if their account ...

Is it possible to execute a function defined within an eval() function using setInterval()?

const evaluation = eval(document.getElementById("codearea").value); setInterval(evaluation, 10); I am seeking a way to access a function that is declared within the eval function, for example: setInterval(evaluation.examplefunc, 10) I attempted ...

Tips for extracting the src attribute from a dynamically generated iframe

My dilemma stems from a function that generates an iframe with content on my website, which unfortunately I cannot control as it is loaded remotely. The function initially creates: <span id="myspan"></span> Once the JavaScript function fu ...

Is there a way for me to navigate to a different page and activate functions from the current page through a hyperlink?

In the scenario presented, there are two main pages - main.jsp and list.jsp. The desired outcome is to trigger a click event on list.jsp's navigation element (nav>ul>li(2)) when the goPage() function is executed in main.jsp. This action is nece ...

JavaScript is experiencing an error where it cannot define a function, rendering it unable to generate a JSON object due to its inability to recognize that the

I've created a JavaScript script function that holds cart items for ordering food. This function takes two parameters: ID and price. Here is a snippet of my script file: <script> function addtocart(mitem, mprice) { var price = ...

Enhance your Google Visualization Chart by dynamically incorporating data sets of varying sizes!

Using simpleXML, I am iterating through data to generate a Google Chart. I need a dynamic method to loop through the data since the number of columns for the chart can change. Here is an example of the data intended for the chart: <dealers> <d ...

methods for converting and saving base64 image strings

I am using PHP to pull content from a table that includes a base64 image string. I would like to remove or drop the base64 string. Just so you know, the text and base64 image are coming from the Summernote WYSIWYG editor. I hope someone can assist me wit ...

Is there a way to verify if an import statement is functioning properly within the Node 6 REPL?

export default config = { apiUrl : "http://localhost:7543" } $ node --version v6.7.0 Is it possible to achieve this without transpiling? Can we polyfill the import functionality without modifying the existing code? I want to input this into the consol ...

Performing a unique mysql query based on the selection made using onchange event in a select element while sending

I have an issue with executing a query onchange in a select element. The goal is to retrieve a specific price for a product based on the size selected. As a beginner with Ajax, I am struggling to send multiple data parameters. The first parameter should ...

"Enhance Your Highchart Experience by Adding Hyperlinks to Every Segment of Your Stacked Bar

I am seeking to assign a specific link to each segment of a stacked 100% bar chart. Check out this demo of a stacked bar chart: http://www.highcharts.com/demo/bar-stacked Here's what I am trying to accomplish: Please visit , input data in the left t ...

Arranging and structuring Handlebars templates

In this particular example... http://example.com/1 ...I am experimenting with organizing a Handlebars template and its corresponding content in separate files, as opposed to having them all combined in the HTML file or JavaScript script, like in this con ...

Activate a mouse click event based on user input in a Shiny

I am currently developing a shiny app that includes a plotly sunburst chart. Once I provide the correctly formatted dataframe, I need to interact with the sunburst chart by clicking on it to "drill-down." Is there a way to replicate this mouse click act ...

How to bypass CORS restrictions in XMLHttpRequest by manipulating HTTP headers?

Currently experimenting with the (deprecated) Twitter API 1.0 For instance, I am interested in retrieving data from the API utilizing AJAX browser requests on cross-origin web pages. This could be a new tab, a local HTML file, or any established website. ...

What are the best ways to condense this JavaScript snippet?

Seeking suggestions for enhancing my coding skills. How can this code be optimized for brevity and efficiency? var resultsConstructionYear = readCookie('constructionYear'); switch (resultsConstructionYear) { case 3: document.getEleme ...