UNPKG

gslides-maker

Version:
143 lines (106 loc) 4.38 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _express = require('express'); var _express2 = _interopRequireDefault(_express); require('dotenv/config'); var _opn = require('opn'); var _opn2 = _interopRequireDefault(_opn); var _googleapis = require('googleapis'); var _lowdb = require('lowdb'); var _lowdb2 = _interopRequireDefault(_lowdb); var _FileSync = require('lowdb/adapters/FileSync'); var _FileSync2 = _interopRequireDefault(_FileSync); var _Memory = require('lowdb/adapters/Memory'); var _Memory2 = _interopRequireDefault(_Memory); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _mkdirp = require('mkdirp'); var _mkdirp2 = _interopRequireDefault(_mkdirp); var _jsonwebtoken = require('jsonwebtoken'); var _jsonwebtoken2 = _interopRequireDefault(_jsonwebtoken); var _log = require('./log'); var _log2 = _interopRequireDefault(_log); const OAuth2 = _googleapis.google.auth.OAuth2 class Authentication { constructor (authOptions) { this.authOptions = authOptions } /** * Start google authentication */ async authenticate () { this.db = this.initDbSync(_path2.default.join(__dirname, '../../.cache/authCode.json')) const webServer = await this.startWebServer() const OAuthClient = await this.createOAuthClient(this.db) const authenticatedUser = await this.getOAuthClient(OAuthClient, this.db, webServer) this.closeServer(webServer.server) return authenticatedUser } initDbSync (filePath) { let adapter if (filePath) { const parentDir = _path2.default.dirname(filePath) _mkdirp2.default.sync(parentDir) adapter = new _FileSync2.default(filePath) } else { adapter = new _Memory2.default('') } return _lowdb2.default.call(void 0, adapter) } async startWebServer () { return new Promise((resolve) => { const app = _express2.default.call(void 0, ) const server = app.listen(3333) resolve({ app: app, server: server }) }) } async waitForGoogleCallback (app) { return new Promise((resolve) => { _log2.default.event('info', 'Waiting for user consent') app.get('/callback', (req, res) => { const authCode = req.query.code res.send('<h1>Thank you!</h1><p>Now close this tab.</p>') resolve(authCode) }) }) } async createOAuthClient (db) { const OAuthClient = new OAuth2( this.authOptions.clientId || process.env.OAUTH_CLIENT_ID, this.authOptions.clientSecret || process.env.OAUTH_CLIENT_SECRET, this.authOptions.redirectUri || process.env.OAUTH_REDIRECT_URI ) OAuthClient.on('tokens', async (tokens) => { if (tokens.refresh_token) { const payload = _jsonwebtoken2.default.decode(tokens.id_token) _log2.default.event('info', `Logged in as ${_log.bold.call(void 0, payload.email)}`) await db.set('user', tokens).write() } }) return OAuthClient } async getOAuthClient (OAuthClient, db, webServer) { const tokens = db.get('user').value() if (tokens) { const payload = _jsonwebtoken2.default.decode(tokens.id_token) _log2.default.event('info', `Logged in as ${_log.bold.call(void 0, payload.email)}`) OAuthClient.setCredentials(tokens) _googleapis.google.options({ auth: OAuthClient }) return _googleapis.google } const consentUrl = OAuthClient.generateAuthUrl({ access_type: 'offline', prompt: 'select_account', scope: ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/presentations', 'openid', 'email' ] }) _opn2.default.call(void 0, consentUrl) const authCode = await this.waitForGoogleCallback(webServer.app) const tokenResponse = await OAuthClient.getToken(authCode) OAuthClient.setCredentials(tokenResponse.tokens) _googleapis.google.options({ auth: OAuthClient }) return _googleapis.google } closeServer (server) { server.close() } } exports.default = Authentication;