Set up google OAuth2 Login with Express
/// STEP 2. make main.ejs
// include get route, get some data callback, get some data
const express = require('express');
const google = require('googleapis').google;
const jwt = require('jsonwebtoken');
// Google's OAuth2 client
const OAuth2 = google.auth.OAuth2;
// Including our config file
const CONFIG = require('./config');
// Creating our express application
const app = express();
// Allowing ourselves to use cookies
const cookieParser = require('cookie-parser');
app.use(cookieParser());
// Setting up Views
app.set('view engine', 'ejs');
app.set('views', __dirname);
////////// app.get '/' Route /////////////////////////
// GET route where we’ll put our link to log in with google.
app.get('/', function (req, res) {
// Create an OAuth2 client object from the credentials in our config file
const oauth2Client = new OAuth2(CONFIG.oauth2Credentials.client_id, CONFIG.oauth2Credentials.client_secret, CONFIG.oauth2Credentials.redirect_uris[0]);
// Obtain the google login link to which we'll send our users to give us access
const loginLink = oauth2Client.generateAuthUrl({
access_type: 'offline', // Indicates that we need to be able to access data continously without the user constantly giving us consent
scope: CONFIG.oauth2Credentials.scopes // Using the access scopes from our config file
});
return res.render("index", { loginLink: loginLink });
});
/////////////////////////////////////////////////////////////
// Redirect user to /get_some_data page,
app.get('/auth_callback', function (req, res) {
// Create an OAuth2 client object from the credentials in our config file
const oauth2Client = new OAuth2(CONFIG.oauth2Credentials.client_id, CONFIG.oauth2Credentials.client_secret, CONFIG.oauth2Credentials.redirect_uris[0]);
if (req.query.error) {
// The user did not give us permission.
return res.redirect('/');
} else {
oauth2Client.getToken(req.query.code, function(err, token) {
if (err)
return res.redirect('/');
// Store the credentials given by google into a jsonwebtoken in a cookie called 'jwt'
res.cookie('jwt', jwt.sign(token, CONFIG.JWTsecret));
return res.redirect('/get_some_data'); // renders index template with login link
});
}
});
/////////////// get_some_data page ////////////////////////////
// In aidan's example, 5 user subscribed channels are displayed.
// Needs to create OAuth2 client then add user’s credentials
// to access anything. Then Gets subscriptions, sends to template.
///////////////////////////////////////////////////////////////
app.get('/get_some_data', function (req, res) {
if (!req.cookies.jwt) {
// We haven't logged in
return res.redirect('/');
}
// Create an OAuth2 client object from the credentials in our config file
const oauth2Client = new OAuth2(CONFIG.oauth2Credentials.client_id, CONFIG.oauth2Credentials.client_secret, CONFIG.oauth2Credentials.redirect_uris[0]);
// Add this specific user's credentials to our OAuth2 client
oauth2Client.credentials = jwt.verify(req.cookies.jwt, CONFIG.JWTsecret);
// Get the youtube service
const service = google.youtube('v3');
// Get five of the user's subscriptions (the channels they're subscribed to)
service.subscriptions.list({
auth: oauth2Client,
mine: true,
part: 'snippet,contentDetails',
maxResults: 5
}).then(response => {
// Render the data view, passing the subscriptions to it
return res.render('data', { subscriptions: response.data.items });
});
});
// Listen on the port defined in the config file
app.listen(CONFIG.port, function () {
console.log(`Listening on port ${CONFIG.port}`);
});