|
|
@@ -1,8 +1,128 @@
|
|
|
-const Koa = require('koa')
|
|
|
+const Koa = require('koa');
|
|
|
+const app = new Koa();
|
|
|
+const views = require('koa-views');
|
|
|
+const json = require('koa-json');
|
|
|
+const onerror = require('koa-onerror');
|
|
|
+const bodyparser = require('koa-bodyparser');
|
|
|
+const logger = require('koa-logger');
|
|
|
+const cors = require('koa2-cors');
|
|
|
+const jwt = require('koa-jwt');
|
|
|
+const helmet = require('koa-helmet');
|
|
|
+const mount = require('koa-mount');
|
|
|
+const set = require('lodash/set');
|
|
|
+const { Provider } = require('oidc-provider');
|
|
|
const consola = require('consola')
|
|
|
const { Nuxt, Builder } = require('nuxt')
|
|
|
|
|
|
-const app = new Koa()
|
|
|
+const secret = require('./config/secret.json');
|
|
|
+const Account = require('./support/account');
|
|
|
+const configuration = require('./support/configuration');
|
|
|
+
|
|
|
+const router = require('./routes/index');
|
|
|
+
|
|
|
+const { PORT = 3000, ISSUER = `http://localhost:${PORT}` } = process.env;
|
|
|
+
|
|
|
+// error handler
|
|
|
+onerror(app);
|
|
|
+
|
|
|
+// middlewares
|
|
|
+app.use(bodyparser({
|
|
|
+ enableTypes:['json', 'form', 'text']
|
|
|
+}));
|
|
|
+
|
|
|
+app.use(cors({
|
|
|
+ origin: 'http://localhost',
|
|
|
+ // exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
|
|
|
+ maxAge: 3600,
|
|
|
+ credentials: true,
|
|
|
+ allowMethods: ['GET', 'POST', 'OPTIONS'],
|
|
|
+ allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
|
|
|
+}));
|
|
|
+
|
|
|
+
|
|
|
+app.use(json());
|
|
|
+app.use(logger());
|
|
|
+app.use(require('koa-static')(__dirname + '/public'));
|
|
|
+
|
|
|
+app.use(views(__dirname + '/views', {
|
|
|
+ extension: 'ejs'
|
|
|
+}));
|
|
|
+
|
|
|
+// logger
|
|
|
+app.use(async (ctx, next) => {
|
|
|
+ const start = new Date();
|
|
|
+ await next();
|
|
|
+ const ms = new Date() - start;
|
|
|
+ console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
|
|
|
+});
|
|
|
+
|
|
|
+// app.use(jwt({
|
|
|
+// secret: secret.sign
|
|
|
+// }).unless({
|
|
|
+// path: [/\/api\/user\/login/, /\/api\/user\/register/]
|
|
|
+// }));
|
|
|
+
|
|
|
+// Custom 401 handling if you don't want to expose koa-jwt errors to users
|
|
|
+app.use(function(ctx, next){
|
|
|
+ return next().catch((err) => {
|
|
|
+ if (401 === err.status) {
|
|
|
+ ctx.status = 401;
|
|
|
+ ctx.body = 'Protected resource, use Authorization header to get access\n';
|
|
|
+ } else {
|
|
|
+ throw err;
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|
|
|
+//
|
|
|
+// // routes
|
|
|
+// app.use(router.routes(provider), router.allowedMethods());
|
|
|
+
|
|
|
+// error-handling
|
|
|
+app.on('error', (err, ctx) => {
|
|
|
+ console.error('server error', err, ctx)
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+// SSO
|
|
|
+app.use(helmet());
|
|
|
+
|
|
|
+if (process.env.NODE_ENV === 'production') {
|
|
|
+ app.proxy = true;
|
|
|
+ set(configuration, 'cookies.short.secure', true);
|
|
|
+ set(configuration, 'cookies.long.secure', true);
|
|
|
+
|
|
|
+ app.use(async (ctx, next) => {
|
|
|
+ if (ctx.secure) {
|
|
|
+ await next();
|
|
|
+ } else if (ctx.method === 'GET' || ctx.method === 'HEAD') {
|
|
|
+ ctx.redirect(ctx.href.replace(/^http:\/\//i, 'https://'));
|
|
|
+ } else {
|
|
|
+ ctx.body = {
|
|
|
+ error: 'invalid_request',
|
|
|
+ error_description: 'do yourself a favor and only use https',
|
|
|
+ };
|
|
|
+ ctx.status = 400;
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+(async () => {
|
|
|
+ let adapter;
|
|
|
+ if (process.env.MONGODB_URI) {
|
|
|
+ adapter = require('./adapters/memory_adapter'); // eslint-disable-line global-require
|
|
|
+ // await adapter.connect();
|
|
|
+ }
|
|
|
+
|
|
|
+ const provider = new Provider(ISSUER, { adapter, ...configuration });
|
|
|
+
|
|
|
+ provider.use(helmet());
|
|
|
+
|
|
|
+ app.use(router(provider).routes(), router(provider).allowedMethods());
|
|
|
+ app.use(mount(provider.app));
|
|
|
+})().catch((err) => {
|
|
|
+ console.error(err);
|
|
|
+ process.exitCode = 1;
|
|
|
+});
|
|
|
|
|
|
// Import and Set Nuxt.js options
|
|
|
const config = require('../nuxt.config.js')
|
|
|
@@ -38,4 +158,7 @@ async function start () {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-start()
|
|
|
+start();
|
|
|
+
|
|
|
+
|
|
|
+// module.exports = app;
|