// Authentication tasks // -------------------- const fs = require('fs'); const {google} = require('googleapis'); // If modifying these scopes, delete token.json. const SCOPES = ['https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata']; // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. const TOKEN_PATH = 'token.json'; function run(req, res, callback) { // Load client secrets from a local file. fs.readFile('credentials.json', (err, content) => { if (err) { return console.log('Error loading client secret file:', err); } // Authorize a client with credentials, then call the Google Drive API. authorize(JSON.parse(content), req, res, callback); }); } // Authentication related function auth_redirect(req, res) { // Load client secrets from a local file. fs.readFile('credentials.json', (err, content) => { if (err) { return console.log('Error loading client secret file:', err); } // Authorize a client with credentials const credentials = JSON.parse(content); const {client_secret, client_id, redirect_uris} = credentials.web; const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]); // oAuth2Client.getToken(ur.searchParams.get("code"), (err, token) => { oAuth2Client.getToken(req.param("code"), (err, token) => { if (err) { return console.error('Error retrieving access token', err); } oAuth2Client.setCredentials(token); // Store the token to disk for later program executions fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => { if (err) return console.error(err); console.log('Token stored to', TOKEN_PATH); }); res.redirect(301, '/tiny'); }); }); } /** * 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. */ function authorize(credentials, req, res, callback) { const {client_secret, client_id, redirect_uris} = credentials.web; const oAuth2Client = new google.auth.OAuth2( client_id, client_secret, redirect_uris[0]); // Check if we have previously stored a token. fs.readFile(TOKEN_PATH, (err, token) => { if (err) return getAccessToken(oAuth2Client, req, res, callback); oAuth2Client.setCredentials(JSON.parse(token)); var apis = google.getSupportedAPIs(); console.log(apis); // TODO: Need to wait until googleapis supports Google Photos. // Will revisit this at that point var api = google; callback(req, res, api); }); } /** * 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 for the authorized client. */ function getAccessToken(oAuth2Client, req, res, callback) { const authUrl = oAuth2Client.generateAuthUrl({ access_type: 'online', scope: SCOPES, }); res.redirect(301, authUrl); } // Exported functions module.exports = { run: run, redirect: auth_redirect } // vim: ai ts=4 sts=4 et sw=4 ft=javascript