Авторизация при помощи сторонних API

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.09, 17:06

Доброго времени суток всем.

Есть такая задача, авторизировать пользователя в системе у которого нет учетной записи.
Есть сторонние API которым я должен передать логин, email, пароль они мне возвращают статус разрешен или запрещен этому пользователю доступ (некий параметр authorize 1 или 0).
Далее я должен послать некий код на email, пользователь должен его получить и ввести в соответствующее поле, я его проверяю если оно совпало с отправленным пускаю в систему. Давайте для простоты без email т.е. Если authorize = 1 даю доступ в систему иначе нет.

По сути мне надо сказать yii, что

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

Yii::$app->user->isGuest = false;
и, желательно,

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

Yii::$app->user->identity->id = логин или email
(в данном случае не важно возможно в API можно будет забрать некий идентификатор пользователя)

Начал ковырять

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

return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
стандартной авторизации, запутался, и мой мозг перестал воспринимать информацию. :?

Подскажите как действовать в подобной ситуации? Может у кого какие идеи есть?
Да и после авторизации никакой учетной записи в таблице user не должно создаваться.
На данный момент роли не интересуют интересует возможность дать доступ пользователю к модулю и не давать.
Нужна любая помощь! :)

Аватара пользователя
samdark
Администратор
Сообщения: 8108
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение samdark » 2017.01.09, 17:26

Вам необходимо реализовать свой Identity, но при этом использовать сторонний сервис вместо базы.
Yii. Сборник рецептов

Нравится Yii? Поставьте звёздочек на github: 1.1 и 2.0.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.09, 17:49

А если не затруднит. Какие исходники посмотреть (пути к файлам)? Или в данном случае не стоит опираться на стандартный функционал Yii и написать свой модуль Типа MyUser::isGuest() и MyUser::getId()? Но какой то велосипед получается.

Аватара пользователя
samdark
Администратор
Сообщения: 8108
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение samdark » 2017.01.09, 19:46

Yii. Сборник рецептов

Нравится Yii? Поставьте звёздочек на github: 1.1 и 2.0.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.10, 15:44

Спасибо, большое! :)
Так понятнее стало куда двигаться.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.11, 17:51

У меня в common config определен компонент

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

    'components' => [
        'user' => [
            'identityClass' => 'yii\web\User',
            'enableAutoLogin' => true,
//            'on '.\yii\web\User::EVENT_BEFORE_LOGIN => ['\common\models\User', 'beforeLogin'],
            'on '.\yii\web\User::EVENT_AFTER_LOGIN => ['\common\models\User', 'afterLogin']
        ],        
    ],
соответственно в '\common\models\User' определенна функция 'afterLogin'
а в frontend config

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

    'components' => [
        'user' => [
            'identityClass' => 'frontend\modules\account\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
        ],
    ],
логика 'frontend\modules\account\models\User' полностью отличается от '\common\models\User'
и в frontend\modules\account\models\User мне ненужно выполнять действия 'afterLogin'.
Но после успешной авторизации (авторизация выполняется в frontend части) выполняется действие 'afterLogin' из '\common\models\User'.

Если я в frontend\modules\account\models\User определяю событие 'afterLogin'

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

	public static function afterLogin($event)
    {
    }	
'afterLogin' из '\common\models\User' все равно выполняется.
Если прописать return true; то 'afterLogin' из '\common\models\User' уже не выполняется

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

	public static function afterLogin($event)
    {
        return true;
    }	
Правильно ли я сделал? "терзают меня смутные сомнения".

Как мне сделать, что бы не выполнялось 'afterLogin' из '\common\models\User'? когда я использую авторизация frontend части

Аватара пользователя
samdark
Администратор
Сообщения: 8108
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение samdark » 2017.01.11, 21:28

Как мне сделать, что бы не выполнялось 'afterLogin' из '\common\models\User'? когда я использую авторизация frontend части
Если классы разделены, ничего выполняться не должно.
Yii. Сборник рецептов

Нравится Yii? Поставьте звёздочек на github: 1.1 и 2.0.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.12, 09:34

А что значит "разделены", как это определить?
один определен в папке frontend/config

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

    'components' => [
        'user' => [
            'identityClass' => 'frontend\modules\account\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
        ],
    ],
другой определен в папке common/config

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

    'components' => [
        'user' => [
            'identityClass' => 'yii\web\User',
            'enableAutoLogin' => true,
//            'on '.\yii\web\User::EVENT_BEFORE_LOGIN => ['\common\models\User', 'beforeLogin'],
            'on '.\yii\web\User::EVENT_AFTER_LOGIN => ['\common\models\User', 'afterLogin']
        ],        
    ],
то что определенно в common действует и на frontend и backend части, верно?
получается строкой
'on '.\yii\web\User::EVENT_AFTER_LOGIN => ['\common\models\User', 'afterLogin']
я передаю выполнение события в '\common\models\User', 'afterLogin'?
но вопрос все равно остается.
Как мне сделать, что бы не выполнялось 'afterLogin' из '\common\models\User'? :(

Аватара пользователя
samdark
Администратор
Сообщения: 8108
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение samdark » 2017.01.12, 13:57

Ну, убрать 'on '.\yii\web\User::EVENT_AFTER_LOGIN => ['\common\models\User', 'afterLogin'] из общего конфига с сунуть туда, где это нужно.
Yii. Сборник рецептов

Нравится Yii? Поставьте звёздочек на github: 1.1 и 2.0.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.12, 15:14

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

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.13, 17:51

В common\models\LoginForm изменил функцию login

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

	public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), 0);
        } else {
            return false;
        }
    }
насколько я понял в return Yii::$app->user->login($this->getUser(), 0); последний параметр $duration = 0 указывает на то что бы не запоминать пользователя.
Когда я закрываю браузер и открываю заново, то пользователь оказывается авторизованным, т.е. Имеет доступ к админке.
Собственно 2 вопроса.
1) как сделать что бы после закрытия браузера авторизация сбрасывалась? Т.е. после открытия браузера пользователь должен заново
авторизоваться.
2) Как сделать так чтобы авторизация действовала ограниченно время? Т.е. после авторизации, не зависимо от того пользователь что-то делал на сайте или нет, по истечении 30 минут авторизация сбрасывалась и пользователь должен по новой авторизоваться.

rak
Сообщения: 1757
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение rak » 2017.01.13, 18:42

1. при закрытии браузера он на самом деле не закрывается, а висит в памяти :)
2. в конфиге нужно вот так настроить компоненты

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

'user'  => [
    'enableAutoLogin' => false,
],
'session'  => [
     'timeout' => 60 * 30,
],

Аватара пользователя
samdark
Администратор
Сообщения: 8108
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Авторизация при помощи сторонних API

Сообщение samdark » 2017.01.14, 13:19

Это всё Chrome. По спецификации он обязан при закрытии убивать сессию, но не делает этого.
Yii. Сборник рецептов

Нравится Yii? Поставьте звёздочек на github: 1.1 и 2.0.

rkk
Сообщения: 32
Зарегистрирован: 2016.03.04, 19:33

Re: Авторизация при помощи сторонних API

Сообщение rkk » 2017.01.16, 12:43

Вот нашел! ;)

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

        'user' => [
            'enableAutoLogin' => false,
            'absoluteAuthTimeout' => 30, // время работы пользователя
        ],
В данном случае пользователь может проработать 30 секунд.
samdark писал(а):
2017.01.14, 13:19
Это всё Chrome. По спецификации он обязан при закрытии убивать сессию, но не делает этого.
Да, действительно только Chrome этим страдает. А какие есть варианты, может есть у кого-то решение?
Может написать JS для закрытия окна который будет вызывать logout, принудительно?

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость