New login screen (#1331)
* wip * feat: first draft of auth.config * chore: auth methodS * chore: styling * styling, styling, styling * feat: Auth notices * chore: Remove server-rendered pages, move shared/components -> components * lint * cleanup * cleanup * fix: Remove unused component * fix: Ensure env variables in prod too * style tweaks * fix: Entering SSO email into login form fails fix: Tweak language around guest signin
This commit is contained in:
@ -1,11 +1,105 @@
|
||||
// @flow
|
||||
import Router from "koa-router";
|
||||
import { reject } from "lodash";
|
||||
import auth from "../middlewares/authentication";
|
||||
import { presentUser, presentTeam, presentPolicies } from "../presenters";
|
||||
import { Team } from "../models";
|
||||
import { signin } from "../../shared/utils/routeHelpers";
|
||||
import { parseDomain, isCustomSubdomain } from "../../shared/utils/domains";
|
||||
|
||||
const router = new Router();
|
||||
|
||||
let services = [];
|
||||
|
||||
if (process.env.GOOGLE_CLIENT_ID) {
|
||||
services.push({
|
||||
id: "google",
|
||||
name: "Google",
|
||||
authUrl: signin("google"),
|
||||
});
|
||||
}
|
||||
|
||||
if (process.env.SLACK_KEY) {
|
||||
services.push({
|
||||
id: "slack",
|
||||
name: "Slack",
|
||||
authUrl: signin("slack"),
|
||||
});
|
||||
}
|
||||
|
||||
services.push({
|
||||
id: "email",
|
||||
name: "Email",
|
||||
authUrl: "",
|
||||
});
|
||||
|
||||
function filterServices(team) {
|
||||
let output = services;
|
||||
|
||||
if (team && !team.googleId) {
|
||||
output = reject(output, service => service.id === "google");
|
||||
}
|
||||
if (team && !team.slackId) {
|
||||
output = reject(output, service => service.id === "slack");
|
||||
}
|
||||
if (!team || !team.guestSignin) {
|
||||
output = reject(output, service => service.id === "email");
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
router.post("auth.config", async ctx => {
|
||||
// If self hosted AND there is only one team then that team becomes the
|
||||
// brand for the knowledgebase and it's guest signin option is used for the
|
||||
// root login page.
|
||||
if (process.env.DEPLOYMENT !== "hosted") {
|
||||
const teams = await Team.findAll();
|
||||
|
||||
if (teams.length === 1) {
|
||||
const team = teams[0];
|
||||
ctx.body = {
|
||||
data: {
|
||||
name: team.name,
|
||||
services: filterServices(team),
|
||||
},
|
||||
};
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If subdomain signin page then we return minimal team details to allow
|
||||
// for a custom screen showing only relevant signin options for that team.
|
||||
if (
|
||||
process.env.SUBDOMAINS_ENABLED === "true" &&
|
||||
isCustomSubdomain(ctx.request.hostname)
|
||||
) {
|
||||
const domain = parseDomain(ctx.request.hostname);
|
||||
const subdomain = domain ? domain.subdomain : undefined;
|
||||
const team = await Team.findOne({
|
||||
where: { subdomain },
|
||||
});
|
||||
|
||||
if (team) {
|
||||
ctx.body = {
|
||||
data: {
|
||||
name: team.name,
|
||||
hostname: ctx.request.hostname,
|
||||
services: filterServices(team),
|
||||
},
|
||||
};
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, we're requesting from the standard root signin page
|
||||
ctx.body = {
|
||||
data: {
|
||||
services: filterServices(),
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
router.post("auth.info", auth(), async ctx => {
|
||||
const user = ctx.state.user;
|
||||
const team = await Team.findByPk(user.teamId);
|
||||
|
Reference in New Issue
Block a user