Skip to content

Instantly share code, notes, and snippets.

@Auronmatrix
Created March 9, 2018 15:35
Show Gist options
  • Save Auronmatrix/91d663b0323aadc9ab4ec75da5bce356 to your computer and use it in GitHub Desktop.
Save Auronmatrix/91d663b0323aadc9ab4ec75da5bce356 to your computer and use it in GitHub Desktop.
Google Oauth for Nodejs
// Authorization code extracted from google quickstart guide
// https://developers.google.com/sheets/api/quickstart/nodejs
const fs = require('fs')
const readline = require('readline')
const { OAuth2Client } = require('google-auth-library')
// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
const TOKEN_DIR = '.credentials/'
const TOKEN_PATH = TOKEN_DIR + 'sheets.token.json'
module.exports = (cb) => {
// Load client secrets from a local file.
fs.readFile('client_secret.json', (err, content) => {
if (err) {
console.log('Error loading client secret file: ' + err)
return
}
// Authorize a client with the loaded credentials, then call the
// Google Sheets API.
authorize(JSON.parse(content), cb)
})
/**
* Create an OAuth2 client with the given credentials, and then execute the
* given callback function.
*
* @param {Object} credentials The authorization client credentials.
* @param {function} callback The callback to call with the authorized client.
*/
const authorize = (credentials, callback) => {
const clientSecret = credentials.installed.client_secret
const clientId = credentials.installed.client_id
const redirectUrl = credentials.installed.redirect_uris[0]
const oauth2Client = new OAuth2Client(clientId, clientSecret, redirectUrl)
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) {
getNewToken(oauth2Client, callback)
} else {
oauth2Client.credentials = JSON.parse(token)
callback(oauth2Client)
}
})
}
/**
* Get and store new token after prompting for user authorization, and then
* execute the given callback with the authorized OAuth2 client.
*
* @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
* @param {getEventsCallback} callback The callback to call with the authorized
* client.
*/
const getNewToken = (oauth2Client, callback) => {
const authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES
})
console.log('Authorize this app by visiting this url: ', authUrl)
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
rl.question('Enter the code from that page here: ', (code) => {
rl.close()
oauth2Client.getToken(code, (err, token) => {
if (err) {
console.log('Error while trying to retrieve access token', err)
return
}
oauth2Client.credentials = token
storeToken(token)
callback(oauth2Client)
})
})
}
/**
* Store token to disk be used in later program executions.
*
* @param {Object} token The token to store to disk.
*/
function storeToken (token) {
try {
fs.mkdirSync(TOKEN_DIR)
} catch (err) {
if (err.code !== 'EEXIST') {
throw err
}
}
fs.writeFile(TOKEN_PATH, JSON.stringify(token))
console.log('Token stored to ' + TOKEN_PATH)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment