project-nomad/admin/app/controllers/admin_auth_controller.ts

49 lines
1.5 KiB
TypeScript

import AdminAuthService from '#services/admin_auth_service'
import type { HttpContext } from '@adonisjs/core/http'
export default class AdminAuthController {
async login({ request, response, session }: HttpContext) {
const user = String(request.input('user', '')).trim()
const password = String(request.input('password', ''))
const redirectTo = this.safeRedirect(request.input('redirect'))
if (!AdminAuthService.authenticate(user, password)) {
session.flash('errors', {
password: AdminAuthService.isConfigured()
? 'The admin user or password was incorrect.'
: 'Admin login is not configured. Set ADMIN_USER and ADMIN_PASS in Docker Compose.',
})
return response.redirect().back()
}
await session.regenerate()
session.put('admin.isLoggedIn', true)
return response.redirect().toPath(redirectTo)
}
async logout({ response, session }: HttpContext) {
session.forget('admin.isLoggedIn')
await session.regenerate()
return response.redirect().toPath('/home')
}
/**
* Restrict redirects to local paths and keep auth routes from looping.
*/
private safeRedirect(value: unknown): string {
const redirectTo = typeof value === 'string' ? value : '/home'
if (!redirectTo.startsWith('/') || redirectTo.startsWith('//')) {
return '/home'
}
if (redirectTo.startsWith('/admin/login') || redirectTo.startsWith('/admin/logout')) {
return '/home'
}
return redirectTo
}
}