gslides-maker
Version:
Generate Google Slides from Wikipedia
143 lines (106 loc) • 4.38 kB
JavaScript
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;
;