'use strict'; const passport = require('koa-passport'); const compose = require('koa-compose'); const { validateRegistrationInput, validateAdminRegistrationInput, validateRegistrationInfoQuery, validateForgotPasswordInput, } = require('../validation/authentication'); module.exports = { login: compose([ (ctx, next) => { return passport.authenticate('local', { session: false }, (err, user, info) => { if (err) { return ctx.badImplementation(); } if (!user) { return ctx.badRequest(info.message); } ctx.state.user = user; return next(); })(ctx, next); }, ctx => { const { user } = ctx.state; ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(user), user: strapi.admin.services.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'); } const { isValid, payload } = strapi.admin.services.token.decodeJwtToken(token); if (!isValid) { return ctx.badRequest('Invalid token'); } ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(payload.id), }, }; }, async registrationInfo(ctx) { try { await validateRegistrationInfoQuery(ctx.request.query); } catch (err) { return ctx.badRequest('QueryError', err); } const { registrationToken } = ctx.request.query; const registrationInfo = await strapi.admin.services.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); } const user = await strapi.admin.services.user.register(input); ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(user), user: strapi.admin.services.user.sanitizeUser(user), }, }; }, async registerAdmin(ctx) { const input = ctx.request.body; try { await validateAdminRegistrationInput(input); } catch (err) { return ctx.badRequest('ValidationError', err); } const hasAdmin = await strapi.admin.services.user.exists(); if (hasAdmin) { return ctx.badRequest('You cannot register a new super admin'); } // TODO: assign super admin role const user = await strapi.admin.services.user.create({ ...input, registrationToken: null, isActive: true, }); ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(user), user: strapi.admin.services.user.sanitizeUser(user), }, }; }, async forgotPassword(ctx) { const input = ctx.request.body; try { await validateForgotPasswordInput(input); } catch (err) { return ctx.badRequest('ValidationError', err); } // log error server side but do not disclose it to end user to avoid leaking informations strapi.admin.services.auth.forgotPassword(input).catch(err => { strapi.log.error(err); }); ctx.status = 204; }, };