57 lines
1.5 KiB
JavaScript
57 lines
1.5 KiB
JavaScript
// @flow
|
|
import passport from "@outlinewiki/koa-passport";
|
|
import addMonths from "date-fns/add_months";
|
|
import debug from "debug";
|
|
import Koa from "koa";
|
|
import bodyParser from "koa-body";
|
|
import Router from "koa-router";
|
|
import { AuthenticationError } from "../errors";
|
|
import auth from "../middlewares/authentication";
|
|
import validation from "../middlewares/validation";
|
|
import { Team } from "../models";
|
|
import { requireDirectory } from "../utils/fs";
|
|
|
|
const log = debug("server");
|
|
const app = new Koa();
|
|
const router = new Router();
|
|
|
|
router.use(passport.initialize());
|
|
|
|
// dynamically load available authentication providers
|
|
requireDirectory(__dirname).forEach(([{ default: provider, config }]) => {
|
|
if (provider && provider.routes) {
|
|
if (!config) {
|
|
throw new Error("Auth providers must export a 'config' object");
|
|
}
|
|
|
|
router.use("/", provider.routes());
|
|
log(`loaded ${config.name} auth provider`);
|
|
}
|
|
});
|
|
|
|
router.get("/redirect", auth(), async (ctx) => {
|
|
const user = ctx.state.user;
|
|
const jwtToken = user.getJwtToken();
|
|
|
|
if (jwtToken === ctx.params.token) {
|
|
throw new AuthenticationError("Cannot extend token");
|
|
}
|
|
|
|
// ensure that the lastActiveAt on user is updated to prevent replay requests
|
|
await user.updateActiveAt(ctx.request.ip, true);
|
|
|
|
ctx.cookies.set("accessToken", jwtToken, {
|
|
httpOnly: false,
|
|
expires: addMonths(new Date(), 3),
|
|
});
|
|
|
|
const team = await Team.findByPk(user.teamId);
|
|
ctx.redirect(`${team.url}/home`);
|
|
});
|
|
|
|
app.use(bodyParser());
|
|
app.use(validation());
|
|
app.use(router.routes());
|
|
|
|
export default app;
|