I am currently trying to implement Oauth 2.0 using axios. I am new to axios and express so please be paitent. Below are two routes, /auth/google (all routes reside inside of /auth router) and /auth/google/callback.
when calling /auth/google using AJAX to start off the chain of events needed, I get a cors error from the var url in /auth/google. I am curious on how I would go about fixing this to ensure oAuth works?
/auth/google and /auth/google/callback (in auth.js)
<code>const REDIRECT_URI = '<http://localhost:8080/auth/google/callback>';
// Initiates the Google Login flow
router.get('/google', (req, res) => {
const url = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=profile email`;
res.redirect(url);
});
router.get('/google/callback', async (req, res) => {
const { code } = req.query;
try {
// Exchange authorization code for access token
const { data } = await axios.post('<https://oauth2.googleapis.com/token>', {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code,
redirect_uri: REDIRECT_URI,
grant_type: 'authorization_code',
});
const { access_token, id_token } = data;
// Use access_token or id_token to fetch user profile
const { data: profile } = await axios.get('<https://www.googleapis.com/oauth2/v1/userinfo>', {
headers: { Authorization: `Bearer ${access_token}` },
});
// Code to handle user authentication and retrieval using the profile data
console.log("profile:" + profile);
console.log("data:" + data);
res.redirect('/');
} catch (error) {
console.error('Error:', error);
//console.error('Error:', error.response.data.error);
res.redirect('/login');
}
});
</code>
<code>const REDIRECT_URI = '<http://localhost:8080/auth/google/callback>';
// Initiates the Google Login flow
router.get('/google', (req, res) => {
const url = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=profile email`;
res.redirect(url);
});
router.get('/google/callback', async (req, res) => {
const { code } = req.query;
try {
// Exchange authorization code for access token
const { data } = await axios.post('<https://oauth2.googleapis.com/token>', {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code,
redirect_uri: REDIRECT_URI,
grant_type: 'authorization_code',
});
const { access_token, id_token } = data;
// Use access_token or id_token to fetch user profile
const { data: profile } = await axios.get('<https://www.googleapis.com/oauth2/v1/userinfo>', {
headers: { Authorization: `Bearer ${access_token}` },
});
// Code to handle user authentication and retrieval using the profile data
console.log("profile:" + profile);
console.log("data:" + data);
res.redirect('/');
} catch (error) {
console.error('Error:', error);
//console.error('Error:', error.response.data.error);
res.redirect('/login');
}
});
</code>
const REDIRECT_URI = '<http://localhost:8080/auth/google/callback>';
// Initiates the Google Login flow
router.get('/google', (req, res) => {
const url = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=profile email`;
res.redirect(url);
});
router.get('/google/callback', async (req, res) => {
const { code } = req.query;
try {
// Exchange authorization code for access token
const { data } = await axios.post('<https://oauth2.googleapis.com/token>', {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code,
redirect_uri: REDIRECT_URI,
grant_type: 'authorization_code',
});
const { access_token, id_token } = data;
// Use access_token or id_token to fetch user profile
const { data: profile } = await axios.get('<https://www.googleapis.com/oauth2/v1/userinfo>', {
headers: { Authorization: `Bearer ${access_token}` },
});
// Code to handle user authentication and retrieval using the profile data
console.log("profile:" + profile);
console.log("data:" + data);
res.redirect('/');
} catch (error) {
console.error('Error:', error);
//console.error('Error:', error.response.data.error);
res.redirect('/login');
}
});
app.js
<code>var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql2');
const dotenv = require('dotenv').config();
const fs = require('fs');
const https = require('https');
const session =require('express-session');
var indexRouter = require('./Routes/index');
var usersRouter = require('./Routes/users');
const crypt = require('bcryptjs');
const cors = require('cors');
const submitEventFormRouter = require('./Routes/submit-event-form');
const authRouter = require('./routes/auth');
const profileUpdateRouter = require('./Routes/profile-update');
const messagesRoutes = require('./Routes/messages'); //For messages
const apiRoutes = require('./Routes/updates');//Updates
var app = express();
//app.use(cors());
const port = process.env.PORT || 4500;
//database connections setup
var conPool = mysql.createPool({
host: 'localhost',
database: 'organisation_db',
});
//basic middleware to parse a new "thred" of connection to each request to run concurrently
app.use(function (req, res, next) {
req.pool = conPool;
next();
});
app.use(session({
secret: '$2a$10$dmz5kZK2jXNvB4rUrclLnOzQTOum.8aA.Cg/g0LWwYfdcvMjWq3HC',
resave: true,
saveUninitialized: true
}));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// Debugging middleware
/*
app.use(function(req, res, next) {
console.log(req.body);
console.log(req.session);
next();
});*/
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/auth', authRouter);
app.use('/profile/update', profileUpdateRouter);
app.use('/api/messages', messagesRoutes);
app.use('/api/updates', apiRoutes);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.get('/login', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
module.exports = app;
</code>
<code>var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql2');
const dotenv = require('dotenv').config();
const fs = require('fs');
const https = require('https');
const session =require('express-session');
var indexRouter = require('./Routes/index');
var usersRouter = require('./Routes/users');
const crypt = require('bcryptjs');
const cors = require('cors');
const submitEventFormRouter = require('./Routes/submit-event-form');
const authRouter = require('./routes/auth');
const profileUpdateRouter = require('./Routes/profile-update');
const messagesRoutes = require('./Routes/messages'); //For messages
const apiRoutes = require('./Routes/updates');//Updates
var app = express();
//app.use(cors());
const port = process.env.PORT || 4500;
//database connections setup
var conPool = mysql.createPool({
host: 'localhost',
database: 'organisation_db',
});
//basic middleware to parse a new "thred" of connection to each request to run concurrently
app.use(function (req, res, next) {
req.pool = conPool;
next();
});
app.use(session({
secret: '$2a$10$dmz5kZK2jXNvB4rUrclLnOzQTOum.8aA.Cg/g0LWwYfdcvMjWq3HC',
resave: true,
saveUninitialized: true
}));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// Debugging middleware
/*
app.use(function(req, res, next) {
console.log(req.body);
console.log(req.session);
next();
});*/
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/auth', authRouter);
app.use('/profile/update', profileUpdateRouter);
app.use('/api/messages', messagesRoutes);
app.use('/api/updates', apiRoutes);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.get('/login', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
module.exports = app;
</code>
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql2');
const dotenv = require('dotenv').config();
const fs = require('fs');
const https = require('https');
const session =require('express-session');
var indexRouter = require('./Routes/index');
var usersRouter = require('./Routes/users');
const crypt = require('bcryptjs');
const cors = require('cors');
const submitEventFormRouter = require('./Routes/submit-event-form');
const authRouter = require('./routes/auth');
const profileUpdateRouter = require('./Routes/profile-update');
const messagesRoutes = require('./Routes/messages'); //For messages
const apiRoutes = require('./Routes/updates');//Updates
var app = express();
//app.use(cors());
const port = process.env.PORT || 4500;
//database connections setup
var conPool = mysql.createPool({
host: 'localhost',
database: 'organisation_db',
});
//basic middleware to parse a new "thred" of connection to each request to run concurrently
app.use(function (req, res, next) {
req.pool = conPool;
next();
});
app.use(session({
secret: '$2a$10$dmz5kZK2jXNvB4rUrclLnOzQTOum.8aA.Cg/g0LWwYfdcvMjWq3HC',
resave: true,
saveUninitialized: true
}));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// Debugging middleware
/*
app.use(function(req, res, next) {
console.log(req.body);
console.log(req.session);
next();
});*/
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/auth', authRouter);
app.use('/profile/update', profileUpdateRouter);
app.use('/api/messages', messagesRoutes);
app.use('/api/updates', apiRoutes);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.get('/login', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
module.exports = app;
request that wont go thru
<code>googleAuth() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = () => {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
} else {
console.error('Failed to query google:', xhttp.statusText);
}
}
};
xhttp.open('GET', `/auth/google`, true);
xhttp.send();
}
</code>
<code>googleAuth() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = () => {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
} else {
console.error('Failed to query google:', xhttp.statusText);
}
}
};
xhttp.open('GET', `/auth/google`, true);
xhttp.send();
}
</code>
googleAuth() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = () => {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
} else {
console.error('Failed to query google:', xhttp.statusText);
}
}
};
xhttp.open('GET', `/auth/google`, true);
xhttp.send();
}