var proxy = require('express-http-proxy'), express = require('express'), expressLogging = require('express-logging'), logger = require('logops'), port = 32100, hostname = '127.0.0.1', supportedScopes = ['profile', 'status', 'avatar'], expiresIn = 3600, low = require('lowdb'), FileSync = require('lowdb/adapters/FileSync'), HttpStatus = require('http-status-codes'), cron = require('node-cron'); const services = require('./app/services'); const adapter = new FileSync(__dirname + '/storage/db.json') const db = low(adapter) db.get('authCodes').value().forEach(codeData => { codeData.expiresDate = function () { var d = new Date(); d.setDate(d.getDate() + 2); return d; }(); services.authorizationService.saveAuthorizationCode(codeData, function (n, codeData) { // console.log(codeData) }) }); logger.getContext = function getContext() { return { // hostname: hostname, // pid: process.pid, // port: port, app: 'Gateway' }; } const app = express() app.use(express.json()); app.use(expressLogging(logger)); app.use((req, res, next) => { logger.debug(Object.assign(req.body, req.query, req.params), 'Request params') next() }) app.listen(port, () => { console.log("Server running on port " + port); }); var OAuthServer = require('simple-oauth-server'), oauthServer = new OAuthServer( services.clientService, services.tokenService, services.authorizationService, services.membershipService, expiresIn, supportedScopes ); function authorize(request, response) { response.statusCode = 403; response.json({ code: 501, message: 'Not Implemented' }); return true; oauthServer.authorizeRequest(request, 'accountid', function (error, authorizationResult) { if (error) { response.statusCode = 400; return response.end(JSON.stringify(error)); } // var code = require('url').parse(authorizationResult.redirectUri, true).query.code; // response.statusCode = 302; // response.setHeader('Location', 'http://localhost:8080/oauth/token?client_id=1&grant_type=authorization_code&client_secret=kittens&code=' + code); response.end(JSON.stringify(authorizationResult)); }); } function grantToken(request, response) { oauthServer.grantAccessToken(request, function (error, token) { if (error) { console.log(error) response.statusCode = 400; return response.json(error); } if (services.getClients()[request.query.client_id].id == 1) { services.heartbeat.puls(token.access_token); } response.json(token); }); } function apiEndpoint(request, response) { console.log(oauthServer.validateAccessToken(request, function (error, validationResult) { if (error) { response.statusCode = 401; return response.json(error); } response.json(validationResult); })); } function heartbeat(request, response) { let updated = services.heartbeat.signal(request.headers.authorization); response.json({ code: updated ? 200 : 400, data: updated }); } const proxyFilter = function (req, res) { return req.hostname == hostname ? true : new Promise(function (resolve) { resolve(function () { if (req.headers.authorization) { let tokenData = services.getAccessTokens()[req.headers.authorization.split(' ').pop()]; // console.log('App token data', tokenData) if (!tokenData || !tokenData.access_token) { res.json({ code: HttpStatus.NOT_ACCEPTABLE }) return false; } if (tokenData.expiresDate < new Date()) { res.json({ code: HttpStatus.NOT_ACCEPTABLE }) return false; } return true; } return false; }()); }); } app.use('/api/v1/browse', proxy('spiduler-browser:32101', { filter: proxyFilter })); app.use('/api/v1/extract', proxy('spiduler-extractor:32102', { filter: proxyFilter })); app.use('/api/v1/manage', proxy('spiduler-manager:32103', { filter: proxyFilter })); app.use('/api/v1/image', proxy('spiduler-image:32104', { filter: proxyFilter })); app.use('/api/v1/godo', proxy('spiduler-godo:32105', { filter: proxyFilter })); app.use('/api/v1/cache', proxy('spiduler-cache:32106', { filter: proxyFilter })); app.use('/api/v1/queue', proxy('spiduler-queue:32107', { filter: proxyFilter })); app.use('/api/v1/ext', proxy('spiduler-external:32108', { filter: proxyFilter })); app.get('/oauth/authorize', authorize) app.get('/api/v1/oauth/token', grantToken) app.get('/oauth/token', grantToken) app.get('/api/test', apiEndpoint) // cron.schedule('0 * * * * *', () => { // services.flushExpiredTokens(300); // });