Как сделать логин в REST

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Как сделать логин в REST

Сообщение evgeniy123 »

Мне нужно понять уже в action пользователь аутентифицирован или нет. Мне нужно парсить заголовок и потом делать запрос к БД для того чтобы понять что за пользователь ?
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Как сделать логин в REST

Сообщение kawabanga »

А обычная аутентификация так не делает? Конечно нужно спросить, есть ли ваш пользователь.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Как сделать логин в REST

Сообщение proctoleha »

evgeniy123 писал(а): 2018.07.20, 00:06 Мне нужно понять уже в action пользователь аутентифицирован или нет. Мне нужно парсить заголовок и потом делать запрос к БД для того чтобы понять что за пользователь ?
Нет, не надо ничего парсить и делать запрос к БД. В Yii2 всё уже реализовано. Читаем документацию.
https://www.yiiframework.com/doc/guide/ ... entication

Если кратко
1. Настраиваем файл конфигурации (роуты, response json, request json, куки, сессии, user identity), например:

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

        'request' => [
            'enableCsrfValidation' => false,
            'enableCookieValidation' => false,
            'enableCsrfCookie' => false,
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'response' => [
            'formatters' => [
                'json' => [
                    'class' => 'yii\web\JsonResponseFormatter',
                    'prettyPrint' => YII_DEBUG,
                    'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
                ],
            ],
        ],
        'user' => [
            'identityClass' => 'app\modules\feedback\models\FeedbackUser',
            'enableAutoLogin' => false,
            'enableSession' => false,
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                '' => 'site/index',
                'PUT update-setting/<name:[\w\d\-_]+>' => 'feedback/setting/update',
                'GET get-setting/<name:[\w\d\-_]+>' => 'feedback/setting/get-value',
                'GET get-all-settings' => 'feedback/setting/get-all-settings',
                'POST login' => 'feedback/login/index',
 		...
            ],
        ],
2. Свои контроллеры наследуем от yii\rest\Controller, прописываем поведения для аутентификации и access, например:

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

namespace app\controllers;

use yii\filters\AccessControl;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\rest\Controller;

class SiteController extends Controller
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['authenticator']['authMethods'] = [
            HttpBasicAuth::class,
            HttpBearerAuth::class,
        ];

        $behaviors['access'] = [
            'class' => AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ];

        return $behaviors;
    }
    ...
}
Всё остальное Yii2 сделает за нас. Подробности в манах.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как сделать логин в REST

Сообщение evgeniy123 »

kawabanga писал(а): 2018.07.20, 05:58 А обычная аутентификация так не делает? Конечно нужно спросить, есть ли ваш пользователь.
обычная так не делает. Она отсекает человека уже на стадии обращения к action. А мне нужно что бы все запросы приходили к action в не зависимости от того у пользователя есть bearer valide или нет. А затем уже в самом action я сам смогу буду делать условия

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

 if(Yii::$app->user->id) {
....
}
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как сделать логин в REST

Сообщение evgeniy123 »

Вообще ничего не понял хотя всю документацию прочитал. Как сделать чтобы все люди заходили без токена, а потом я бы проверял что может это админ, беря значение Autorisation из header ?
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Как сделать логин в REST

Сообщение skynin »

evgeniy123 писал(а): 2018.07.20, 11:20 ... отсекает человека уже на стадии обращения к action. А мне нужно что бы все запросы приходили к action в не зависимости от того у пользователя есть bearer valide или нет. А затем уже в самом action я сам смогу буду делать условия
...
а потом я бы проверял что может это админ,
то есть вам нужна система контроля прав, на основе ролей. гуглите Yii2 RBAC

HttpBasicAuth
HttpBearerAuth
отвечают за проверку - "залогинен" пользователь или нет, а не для проверки роли пользователя в системе

Аутентификация, авторизация и идентификация

Идентификация (от латинского identifico — отождествлять): присвоение субъектам и объектам идентификатора и / или сравнение идентификатора с перечнем присвоенных идентификаторов. Например, представление человека по имени отчеству - это идентификация.

Аутентификация (от греческого: αυθεντικός ; реальный или подлинный): подтверждение подлинности чего-либо или кого либо. Например, предъявление паспорта - это подтверждение подлинности заявленного имени отчества.

Авторизация является функцией определения прав доступа к ресурсам и управления этим доступом. Авторизация — это не то же самое что идентификация и аутентификация: идентификация — это называние лицом себя системе; аутентификация — это установление соответствия лица названному им идентификатору; а авторизация — предоставление этому лицу возможностей в соответствие с положенными ему правами или проверка наличия прав при попытке выполнить какое-либо действие. Например, авторизацией являются лицензии на осуществление определённой деятельности.
evgeniy123 писал(а): 2018.07.20, 11:20 я сам смогу буду делать условия

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

if(Yii::$app->user->id) {
....
}
ну так дайте всем залогиненным(аутентифицированным) пользователям права на доступ, и RBACом, или if(Yii::$app->user->id) - авторизируйте их
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как сделать логин в REST

Сообщение evgeniy123 »

Все гораздо проще чем я думал:

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

$behaviors['authenticator'] = [
            'class' => HttpBearerAuth::class,
            'optional'=> ['index']  //___ Here !!
        ];
        
        
Закрыто