Разная авторизация в разных контроллерах API

Всё что касается построения API
Ответить
Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Разная авторизация в разных контроллерах API

Сообщение vitovt » 2017.04.25, 19:22

Структура проекта на основе advanced:

Код: Выделить всё

- api
--- modules
------ v1
-------- controllers
-------- models
...
- backend
- common
-frontend
Задача заключается в следуюещм:

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

main.php

Код: Выделить всё

 'user' => [
            'identityClass' => 'api\models\Partners',
        ],
С другой стороны есть, например, frontend и mobile app - которые также хотят работать с API, но метод авторизации у них другой. Запрос делать они будут к своим контроллерам. Например, frontend будет написан на Angular и никакой авторизации через headers не будет.

Frontent - там уже обычные люди, залогиненные с логином\паролем, имеющие свой кабинет и так далее.

Но не хочется плодить два API у каждого будет своя версионность и свои контроллеры. Можно ли и как организовать 1 точку входа с разной авторизацией, разными \Yii::$app->user и так далее?

Аватара пользователя
SiZE
Сообщения: 2699
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Разная авторизация в разных контроллерах API

Сообщение SiZE » 2017.04.25, 20:58

oauth
в поиске работы

Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Разная авторизация в разных контроллерах API

Сообщение vitovt » 2017.04.26, 09:27

Как это поможет? Oauth это всего лишь реализация еще одного вида авторизации. Я к тому, что oAuth по идее предполагает, что у меня есть общая база пользователей. А ее как бы нет, плюс не понимаю, как тот же frontend будет работать через oAuth - ему что, каждый раз получать токен и производить действия?

Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Разная авторизация в разных контроллерах API

Сообщение vitovt » 2017.04.26, 10:57

В поисках решения увидел на одном сайте такой вариант (весь фронтэнд на angular)

При запросе к API отправляется

Код: Выделить всё

Authorization:Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ2aXRvdnRAZ21haWwuY29tIiwiaWF0IjoxNDkzMTkyNT
Это все логично, почти тот же oAuth только key генерируется в момент авторизации. А вот как в рамках Yii2 внутри. Получается нужно писать свой какой-то 'identityClass' => 'common\models\User', который будет выбирать пользователя по Bearer сначала в одной таблице, потом во второй, если в обоих таблицах ничего нет - то 401 так чтоли? Без лишнего запроса никак? Условно говоря для ProductController - компонент user свой, для MessageController - свой ?

sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Разная авторизация в разных контроллерах API

Сообщение sosnovskiy » 2017.04.26, 20:17

Зачем вам несколько идентити?
По топику:
Один контроллер может поддерживать несколько способов авторизации. Ищите по слову compositeAuth

Аватара пользователя
vitovt
Сообщения: 210
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Разная авторизация в разных контроллерах API

Сообщение vitovt » 2017.04.27, 09:36

sosnovskiy писал(а):
2017.04.26, 20:17
Зачем вам несколько идентити?
По топику:
Один контроллер может поддерживать несколько способов авторизации. Ищите по слову compositeAuth

Несколько идентити думаю для того, чтобы разделять клиентов, которые пользуются API

Например где-то в коде я использую

\Yii::$app->user->id

Так вот этот ID у партнера свой, потому, что все партнеры лежат в отдельной таблице, а у пользователей (например с фронтэнда) свой.

Грубо говоря идентити для партнера реализуется классом Partner со своим набором полей, а для пользователя - User

Решил проблему пока так:

Создал общий класс

AuthUser

Код: Выделить всё


<?php
namespace api\models;

class AuthUser {

    public static function findIdentityByAccessToken($token, $type = null)
    {
        $user = Partner::findOne(['access_token' => $token]);

        if( $user ) {
            return $user;
        }

        $user = User::findOne(['access_token' => $token ]);

        return $user;
    }

}

В конфиге соответсвенно подключаю

Код: Выделить всё

 'user' => [           
            'identityClass' => 'api\models\AuthUser',
        ],



Про compositeAuth почитаю, может придется мое решение переделать =)

Ответить