181 lines
4.2 KiB
JavaScript
Raw Normal View History

'use strict';
const passport = require('koa-passport');
const compose = require('koa-compose');
2021-07-28 15:32:21 +02:00
const { getService } = require('../utils');
const {
validateRegistrationInput,
validateAdminRegistrationInput,
validateRegistrationInfoQuery,
validateForgotPasswordInput,
validateResetPasswordInput,
} = require('../validation/authentication');
module.exports = {
login: compose([
(ctx, next) => {
return passport.authenticate('local', { session: false }, (err, user, info) => {
if (err) {
2021-01-27 11:52:02 +01:00
strapi.eventHub.emit('admin.auth.error', { error: err, provider: 'local' });
return ctx.badImplementation();
}
if (!user) {
2021-01-27 11:52:02 +01:00
strapi.eventHub.emit('admin.auth.error', {
error: new Error(info.message),
provider: 'local',
});
return ctx.badRequest(info.message);
}
ctx.state.user = user;
2021-01-27 11:52:02 +01:00
strapi.eventHub.emit('admin.auth.success', { user, provider: 'local' });
return next();
})(ctx, next);
},
ctx => {
const { user } = ctx.state;
ctx.body = {
data: {
2021-07-28 15:32:21 +02:00
token: getService('token').createJwtToken(user),
user: getService('user').sanitizeUser(ctx.state.user), // TODO: fetch more detailed info
},
};
},
]),
renewToken(ctx) {
const { token } = ctx.request.body;
if (token === undefined) {
return ctx.badRequest('Missing token');
}
2021-07-28 15:32:21 +02:00
const { isValid, payload } = getService('token').decodeJwtToken(token);
if (!isValid) {
return ctx.badRequest('Invalid token');
}
ctx.body = {
data: {
2021-07-28 15:32:21 +02:00
token: getService('token').createJwtToken({ id: payload.id }),
},
};
},
async registrationInfo(ctx) {
try {
await validateRegistrationInfoQuery(ctx.request.query);
} catch (err) {
return ctx.badRequest('QueryError', err);
}
const { registrationToken } = ctx.request.query;
2021-07-28 15:32:21 +02:00
const registrationInfo = await getService('user').findRegistrationInfo(registrationToken);
if (!registrationInfo) {
return ctx.badRequest('Invalid registrationToken');
}
ctx.body = { data: registrationInfo };
},
async register(ctx) {
const input = ctx.request.body;
try {
await validateRegistrationInput(input);
} catch (err) {
return ctx.badRequest('ValidationError', err);
}
2021-07-28 15:32:21 +02:00
const user = await getService('user').register(input);
ctx.body = {
data: {
2021-07-28 15:32:21 +02:00
token: getService('token').createJwtToken(user),
user: getService('user').sanitizeUser(user),
},
};
},
async registerAdmin(ctx) {
const input = ctx.request.body;
try {
await validateAdminRegistrationInput(input);
} catch (err) {
return ctx.badRequest('ValidationError', err);
}
2021-07-28 15:32:21 +02:00
const hasAdmin = await getService('user').exists();
if (hasAdmin) {
return ctx.badRequest('You cannot register a new super admin');
}
2021-07-28 15:32:21 +02:00
const superAdminRole = await getService('role').getSuperAdmin();
if (!superAdminRole) {
throw new Error(
"Cannot register the first admin because the super admin role doesn't exist."
);
}
2021-07-28 15:32:21 +02:00
const user = await getService('user').create({
...input,
registrationToken: null,
isActive: true,
roles: superAdminRole ? [superAdminRole.id] : [],
});
2021-08-06 10:51:34 +02:00
strapi.telemetry.send('didCreateFirstAdmin');
ctx.body = {
data: {
2021-07-28 15:32:21 +02:00
token: getService('token').createJwtToken(user),
user: getService('user').sanitizeUser(user),
},
};
},
async forgotPassword(ctx) {
const input = ctx.request.body;
try {
await validateForgotPasswordInput(input);
} catch (err) {
return ctx.badRequest('ValidationError', err);
}
2021-07-28 15:32:21 +02:00
getService('auth').forgotPassword(input);
ctx.status = 204;
},
async resetPassword(ctx) {
const input = ctx.request.body;
try {
await validateResetPasswordInput(input);
} catch (err) {
return ctx.badRequest('ValidationError', err);
}
2021-07-28 15:32:21 +02:00
const user = await getService('auth').resetPassword(input);
ctx.body = {
data: {
2021-07-28 15:32:21 +02:00
token: getService('token').createJwtToken(user),
user: getService('user').sanitizeUser(user),
},
};
},
};