Files
bro-app-gateway/index.js
2020-10-08 20:08:54 +09:00

136 lines
4.2 KiB
JavaScript

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)
})
});
const app = express()
app.use(expressLogging(logger));
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/headless', proxy('spiduler-headless:32101', {
filter: proxyFilter
}));
app.use('/api/v1/spider', proxy('spiduler-spider:32102', {
filter: proxyFilter
}));
app.use('/api/v1/spiduler', proxy('spiduler-schedule:32103', {
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);
// });