generate(); return $this->withJson($response, compact('key')); } public function login(Request $request, Response $response, Service $service, LoginService $loginService, UserMapper $mapper): Response { $post = json_decode($request->getBody()); $user = $mapper->fetchByName($post->name); $output = [ 'login' => false, 'token' => '' ]; if (!$user or !$user->enabled) { return $this->withJson($response, $output); } if ($user->validate($post->password)) { $token = $service->generateToken(); $status = $loginService->setToken($user, $token->selector, $token->token); if ($status['logged_in']) { $output['login'] = true; $output['token'] = $token->full; $output['expires'] = $status['expires']; } } return $this->withJson($response, $output); } public function validate(Request $request, Response $response, LoginService $loginService): Response { $post = json_decode($request->getBody()); $valid = $loginService->validate($post); $output = [ 'token' => $post->token ]; if ($valid) { $output['status'] = 'Authorized'; } else { $output['error'] = 'Not authorized'; } return $this->withJson($response, $output, $valid ? 200 : 401); } public function user(Request $request, Response $response, LoginService $loginService): Response { $post = json_decode($request->getBody()); $user = $loginService->getUser($post); if (!$user) { return $this->withJson($response, ['token' => $post->token, 'error' => 'Not authorized'], 401); } $output = [ 'token' => $post->token, 'user' => $user->name ]; return $this->withJson($response, $output); } public function logout(Request $request, Response $response, LoginService $loginService): Response { $post = json_decode($request->getBody()); $user = $loginService->getUser($post); if (!$user) { return $this->withJson($response, ['logout' => true]); } $output = [ 'token' => $post->token, 'logout' => $loginService->logout($user) ]; return $this->withJson($response, $output); } }