Yii2 Api - Использование Oauth для аутентификации пользователя и веб-сайта? - PullRequest
0 голосов
/ 23 мая 2018

Я создаю сервис, который обрабатывает контент с разных сайтов.Каждый веб-сайт имеет своих собственных пользователей.

Поэтому мне нужно аутентифицировать веб-сайт, который обращается к моему API, и мне нужно аутентифицировать пользователя, который входит в систему с этого веб-сайта.

Поскольку Yii2 не можетобрабатывать 2 параллельных пользовательских идентификатора и по этому сценарию я не могу использовать роли.Я решил построить его следующим образом:

Работа с веб-сайтом

У меня есть таблица с именем "Веб-сайт", веб-сайт содержит 2 поля access_token и expiration_token.

С любого из веб-сайтов (которые являются базовыми установками Yii) они делают:

<code>        $data = array();
        $data['api_key'] = 'xxxxx';
        $data['api_secret'] = 'zzzzzz';

        $client = new Client(['baseUrl' => 'https://website.api/index.php?r=v1']);
        $response = $client->post('website/get-access-token', $data)->send();
        echo "<pre>";
        var_dump($response->content);
        echo "
";

, если срок действия токена истек, они могут сделать еще один запрос к точке входа 'website / refresh-access-token '

Затем каждый запрос GET или POST должен отправлять этот access_token, который сохраняется в SESSION (токен истекает каждые 7 дней).

Этоне обрабатывается никакими проверками HTTP, просто прямой запрос к API для токена.

Обработка пользователей

Для этой части, когда пользователь проходит аутентификацию, используя электронную почту / пароль или социальные сети, Я делаю запрос к контроллеру пользователя, где я установил токены на предъявителя:

public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => CompositeAuth::className(),
            'authMethods' => [
                HttpBearerAuth::className()
            ]
        ];
        return $behaviors;
    }

Эта часть находится в процессе разработки, поэтому предполагается, что веб-сайт сделает запрос к точке входа в систему:

<code>$client = new Client(['baseUrl' => 'https://website.api/index.php?r=v1']);
        $response = $client->post('user/login', $data)->send();
        echo "<pre>";
        var_dump($response->content);
        echo "
";

Предполагается получить access_token, а также проверить дату истечения срока действия токена.

Мои вопросы:

Это хорошая идея для обработки запросов API для моегоконкретный сценарий?Я думаю, что есть много звонков, чтобы получить простые данные.Нужно ли использовать токен для получения данных?

Если я хочу использовать токены Bearer для обработки содержимого и доступа пользователей, как бы я это сделал?

1 Ответ

0 голосов
/ 24 мая 2018

Так как Yii2 не может обрабатывать 2 параллельных идентификатора пользователя

Я думаю, что ни одна программа или система не должна поддерживать параллельные сеансы пользователя, по крайней мере, в таких случаях.Вы создаете API, поэтому сделайте его без состояний , не используйте ни одного сеанса.Сделайте это полностью на основе токенов.Подробнее об этом здесь:

Я бы предложил использовать Yii2 RESTful API для сопоставления ваших сущностей и реализации полной OAuth 2.0 аутентификации, котораяэто то, для чего обычно используются токены на предъявителя.Вот еще 2 замечательных ресурса:

Хорошая архитектура, которая мне нравится, и я обычноиспользование происходит путем отделения логики аутентификации от приложения, как если бы они были 2 приложениями:

> auth
> api

Первое: auth получает пользовательские login/password или входные данные, связанные с формой регистрации, или обрабатывает стороннюю аутентификацию,затем в случае успеха генерирует 2 токена: долгоживущий refresh_token и недолговечный access_token , как описано в связанных статьях.Затем refresh_token следует сохранить в базе данных, так как он будет существовать месяцами, годами или навсегда и использоваться только для генерации токенов доступа.

access_token вдругая сторона может быть сохранена в памяти, так как она будет жить очень короткое время и будет извлекаться и сравниваться при каждом запросе.Я думаю, что компонент кэша Yii2 является идеальным местом для его хранения, поскольку он поддерживает различные хранилища и базы данных, такие как REDIS или MemCache, а также имеет атрибут срока действия , который можно установить при добавлении значения , поэтомутокен будет автоматически удален, если он устарел.

Личные действия приложения auth, например, создание нового токена доступа по истечении срока действия, должны использовать только refresh_token для распознавания пользователей.поэтому он может иметь свой собственный класс User, использующий этот токен для их аутентификации.

Приложение api, с другой стороны, является тем, которое доставляет данные.Он не должен ничего знать о токенах обновления.Единственная общая вещь между обоими приложениями - компонент кеша.Он получает запрос, содержащий токен доступа, определяет, с каким пользователем он связан, выполняя поиск в кэше, если он не найден, то это либо неизвестный пользователь, либо токен с истекшим сроком действия.

Ниже приведена рабочая реализация для этого.логика, которую вы можете проверить: https://github.com/tunecino/yii2-app-builder

...