Обертка для аутентификации пользователя с использованием cURL в PHP

Поэтому я создал класс-оболочку для аутентификации пользователя через HTTP-запрос POST.

    class Nucleolus
    {
        public const AUTHEN_USER_URL = "localhost:8000/authen/user";
    
        protected $ch;
    
        public function __construct(string $token)
        {
            $this->ch = curl_init();
            curl_setopt($this->ch, CURLOPT_URL, self::AUTHEN_USER_URL);
            curl_setopt($this->ch, CURLOPT_HTTPHEADER, [
                "Content-Type: application/json",
                "Authorization: Bearer " . $token,
            ]);
            curl_setopt($this->ch, CURLOPT_POST, 1);
            curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
        }
    
        public function authenticate(string $username, string $password, string $serverUrl = null)
        {
            $url = $serverUrl ? $serverUrl : $_SERVER['SERVER_NAME'];
            curl_setopt($this->ch, CURLOPT_POSTFIELDS, json_encode(compact('url', 'username', 'password')));
    
            return json_decode(curl_exec($this->ch), true);
        }
    
        public function __destruct()
        {
            curl_close($this->ch);
        }
    }

Затем другие разработчики могут сделать следующее.

    $nucleolus = new Nucleolus($token);
    $result = $nucleolus->authenticate($username, $password);

и получить результат в виде массива PHP.
Пожалуйста ознакомтесь.

1 ответ
1

Скажу откровенно: этот код — просто Франкенштейн, сшитый из разных не связанных между собой частей. В основном это две основные проблемы:

  • отправка HTTP-запросов — отдельная задача и должна выполняться другой оболочкой
  • разделение основной функциональности между двумя методами просто не имеет смысла. Я понимаю, что вы, вероятно, хотели использовать конструктор, но это не так.

Класс HTTP-запроса

По сути, должен быть класс, который выполняет HTTP-запросы с методами для установки определенных параметров, таких как

  • setAuth(new BearerAuth($token))
  • setContentType()
  • setUrl()
  • так далее

Проверка ошибок

Также в этом классе важно проверять наличие ошибок. Прямо сейчас ваш код возвращает все, что было отправлено другой стороной. Но это не обязательно будет JSON определенного формата. Это может быть HTML, JSON, содержащий разные данные, пустая строка и т. Д.

  • Прежде всего, код должен проверить curl_error. В случае, если есть, он должен выбросить исключение
  • Затем он должен попытаться декодировать JSON. Если это не удается, он должен выбросить исключение.
  • Затем он должен проверить, содержат ли декодированные данные ожидаемую информацию. Если этого не произойдет, он должен выбросить исключение.
  • только тогда он должен вернуть данные

Фактический класс

И тогда может быть класс для взаимодействия с конкретным API, что-то вроде этого

class Nucleolus
{
    protected $transport;
    protected $host;

    public function __construct(string $host, string $token)
    {
        $this->transport = new HTTPTransport;
        $this->transport->setAuth(new BearerAuth($token));
        $this->transport->setContentType('application/json');
    }

    public function authenticate(string $username, string $password, string $serverUrl = null)
    {
        $this->transport->setUrl($this->host."/authen/user");
        $result = $this->transport->post([
            'url' => $serverUrl ? $serverUrl : $_SERVER['SERVER_NAME'], 
            'username' => $username, 
            'password' => $password,
        ]);
        $data = JSON::decode($result);
        if ($data === true)
            return true;
        } else {
            throw new NucleolusException("Incorrect data from auth: $result");
        }
    }
}

Деструктор на самом деле не нужен, поскольку PHP все разрушит сам.

  • Спасибо за ваш комментарий

    — Анурат Чапанонд

  • есть ли способ сделать это одним файлом, чтобы его было легко распространять?

    — Анурат Чапанонд

  • Что значит «легко распространять»? Распространение обычно осуществляется через пакеты композитора.

    — Ваш здравый смысл

  • все еще есть люди, которые не используют композитор в организации.

    — Анурат Чапанонд

  • Внутри организации для распространения кода должна использоваться система параллельных версий, такая как git.

    — Ваш здравый смысл

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *