$user->getAuth()]); } public static function getToken(): string { self::requireMethod('POST'); $input = self::getPost(); if (null === $input) { return self::error(self::ERROR_INVALID_INPUT); } $auth = $input[self::PARAMETER_AUTH] ?? null; if (null === $auth) { return self::error(self::ERROR_MISSING_PARAMETER, self::PARAMETER_AUTH); } $callback = $input[self::PARAMETER_CALLBACK_URL] ?? null; if (null === $callback) { return self::error(self::ERROR_MISSING_PARAMETER, self::PARAMETER_CALLBACK_URL); } $user = User::verifyAuth($auth); if (null === $user) { return self::error(self::ERROR_INVALID_AUTH); } $token = $user->getToken($callback); return self::response([self::PARAMETER_TOKEN => $token]); } public static function getUser(): string { self::requireMethod('POST'); $input = self::getPost(); if (null === $input) { return self::error(self::ERROR_INVALID_INPUT); } $auth = $input[self::PARAMETER_AUTH] ?? null; if (null === $auth) { return self::error(self::ERROR_MISSING_PARAMETER, self::PARAMETER_AUTH); } $user = User::verifyAuth($auth); if (null === $user) { return self::error(self::ERROR_INVALID_AUTH); } $token = $input[self::PARAMETER_TOKEN] ?? null; if (null === $token) { return self::error(self::ERROR_MISSING_PARAMETER, self::PARAMETER_TOKEN); } if (!$user->verifyToken($token)) { return self::error(self::ERROR_INVALID_TOKEN); } $userData = $user->getLoginData($token); if (null === $userData) { return self::error(self::ERROR_INVALID_LOGIN); } return self::response($userData); } private static function json(array $values): string { return json_encode($values, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } private static function response(array $values): string { $response = [ self::LABEL_ERROR_CODE => self::ERROR_OK, self::LABEL_STATUS => self::STATUS_OK, self::LABEL_DESCRIPTION => self::ERROR_DESCRIPTIONS[self::ERROR_OK], ]; $response += $values; return self::json($response); } private static function error(int $errorCode, ...$parameters): string { $status = $errorCode == self::ERROR_OK ? self::STATUS_OK : self::STATUS_ERROR; return self::json([ self::LABEL_ERROR_CODE => $errorCode, self::LABEL_STATUS => $status, self::LABEL_DESCRIPTION => vsprintf(self::ERROR_DESCRIPTIONS[$errorCode], $parameters), ]); } protected const LABEL_ERROR_CODE = 'code'; protected const LABEL_DESCRIPTION = 'description'; protected const LABEL_STATUS = 'status'; protected const ERROR_OK = 0; protected const ERROR_INVALID_AUTH = 1; protected const ERROR_INVALID_LOGIN = 2; protected const ERROR_INVALID_TOKEN = 3; protected const ERROR_INVALID_INPUT = 4; protected const ERROR_MISSING_PARAMETER = 5; protected const ERROR_INVALID_PASSWORD = 6; protected const STATUS_OK = 'success'; protected const STATUS_ERROR = 'error'; protected const ERROR_DESCRIPTIONS = [ self::ERROR_OK => 'success', self::ERROR_INVALID_AUTH => 'invalid or expired authorization', self::ERROR_INVALID_LOGIN => 'no login associated with this token', self::ERROR_INVALID_TOKEN => 'invalid or expired token', self::ERROR_INVALID_INPUT => 'invalid input', self::ERROR_MISSING_PARAMETER => "parameter '%s' is missing", self::ERROR_INVALID_PASSWORD => 'invalid username or password', ]; protected const PARAMETER_AUTH = 'auth'; protected const PARAMETER_CALLBACK_URL = 'callback'; protected const PARAMETER_REDIRECT = 'redirect'; protected const PARAMETER_TOKEN = 'token'; protected const PARAMETER_USERNAME = 'username'; protected const PARAMETER_PASSWORD = 'password'; }