Yii2 Rest + CORS + авторизация по токен

Всё что касается построения API
Ответить
dr78
Сообщения: 12
Зарегистрирован: 2013.03.15, 15:53

Yii2 Rest + CORS + авторизация по токен

Сообщение dr78 »

Добрый день.
Столкнулся со следующей проблемой.
Мой клиент отправляет запрос по следующему алгоритму, описанному здесь http://www.pixelcom.crimea.ua/sozdat-cors-zapros.html

То есть мой запрос выглядит так - я отправляю GET-запрос, а к нему добавляется еще OPTIONS

Сейчас у меня вываливается ошибка 405 Method Not Allowed:

Как настроить yii2 CORS, чтобы он пропускал запрос?
Вложения
method-not-allowed.png
method-not-allowed.png (47.67 КБ) 10297 просмотров
request.png
request.png (28.49 КБ) 10297 просмотров
dr78
Сообщения: 12
Зарегистрирован: 2013.03.15, 15:53

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение dr78 »

Клиент осуществляет междоменный запрос через браузер -поэтому у меня OPTIONS вместо GET
если настраивать в контроллере $behaviors['verbFilter'], то не проходит авторизацию по токену
Я использую Bearer- то есть заголовок с клиента уходит такой:
Authorization: Bearer token_value
Однако в этом случае авторизация по токену не проходит - он его просто не видит
Если рубить функцию public function beforeAction($event) в VerbFilter - все работает
и заголовок проходит и аутентификация по токену.
:?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение zelenin »

dr78 писал(а): если настраивать в контроллере $behaviors['verbFilter'], то не проходит авторизацию по токену
почему?
dr78
Сообщения: 12
Зарегистрирован: 2013.03.15, 15:53

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение dr78 »

class HttpBearerAuth->public function authenticate

$authHeader = $request->getHeaders()->get('Authorization') - выдает null
и разумеется аутентификация не пройдена...
Почему $request->getHeaders()->get('Authorization') в этом случае null и какое отношение это имеет к $behaviors['verbFilter'] - я не понимаю
:(
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение zelenin »

dr78 писал(а):class HttpBearerAuth->public function authenticate

$authHeader = $request->getHeaders()->get('Authorization') - выдает null
и разумеется аутентификация не пройдена...
Почему $request->getHeaders()->get('Authorization') в этом случае null и какое отношение это имеет к $behaviors['verbFilter'] - я не понимаю
:(
посмотрите на заголовки, отправляемые клиентом - есть ли там Authorization. Подебажьте чуток. "почему-то не работает" и "какое отношение - не понимаю" - это несерьезный подход.
dr78
Сообщения: 12
Зарегистрирован: 2013.03.15, 15:53

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение dr78 »

:D
Вот уж такого ответа я точно не ожидал, спасибо за помощь....

P.S.
подебажил, воткнул костыль, времени разбираться пока нет, пошел дальше
Считаю, что если Rest включен в ядро, то дебажить уже как-бы нечего как и костыли лепить.
Заголовок от клиента уходит и аутентификация проходит.
Это для меня главное, хотя я понимаю что реализация у меня неверная.
Поэтому и обратился за помощью.
Ломать копья и холиварить - нету времени увы)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение zelenin »

dr78 писал(а)::D
Вот уж такого ответа я точно не ожидал, спасибо за помощь....

P.S.
подебажил, воткнул костыль, времени разбираться пока нет, пошел дальше
Считаю, что если Rest включен в ядро, то дебажить уже как-бы нечего как и костыли лепить.
Заголовок от клиента уходит и аутентификация проходит.
Это для меня главное, хотя я понимаю что реализация у меня неверная.
Поэтому и обратился за помощью.
Ломать копья и холиварить - нету времени увы)
какого ответа вы не ожидали?)
вы пожаловались, что у вас что-то не работает. На скрине видно, что вам дают отлуп, т.к. вы обращаетесь к экшну неразрешенным методом (OPTIONS). CORS тут не причем, т.к. проверку делает другой фильтр. Я вам дал ссылку на метод, где указаны разрешенные методы, предлагая расширить их количество засчет добавления OPTIONS. Вы написали что не работает и вы ничерта не понимаете. Как еще вам помочь?
Да, REST есть в yii2, но он тут не причем.
dr78
Сообщения: 12
Зарегистрирован: 2013.03.15, 15:53

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение dr78 »

Все, спасибо за помощь.
Предлагаю диалог закрыть и каждому остаться при своем мнении.

Тему пока оставляю - с надеждой, что кто-то уже сталкивался с подобным вопросом.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение zelenin »

dr78 писал(а):Все, спасибо за помощь.
Предлагаю диалог закрыть и каждому остаться при своем мнении.

Тему пока оставляю - с надеждой, что кто-то уже сталкивался с подобным вопросом.
а какое ваше мнение? я не вижу его. Вы выставляете дискуссию в конфликтном ключе, хотя не вижу тут повода для конфликта. "Не работает" - это конец темы, если не предоставлена дополнительная информация.
footniko
Сообщения: 16
Зарегистрирован: 2012.07.04, 23:43

Re: Yii2 Rest + CORS + авторизация по токен

Сообщение footniko »

На самом деле CORS тут отыгривает большую роль. Если Вы делаете межсайтовый запрос, то, по умолчанию, с браузера сначала отсылается запрос типа OPTIONS. На него можно просто ответить кодом 200. По умолчанию у Yii2 REST так и сделано. Если у Вас не работает, значит Вы неправильно урлы настроили. Не знаю какая у Вас там реализация, но, к примеру, это:

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

'GET v2/search/item' => 'v2/item/index',
'POST v2/search/item' => 'v2/item/create',
'GET v2/search/item/<id:[\w-]+>' => 'v2/item/view',
'PUT v2/search/item/<id:[\w-]+>/status' => 'v2/item/update-status',
Лучше заменить вот этим:

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

[
    'class' => \yii\rest\UrlRule::class,
    'pluralize' => false,
    'controller' => [
        'v2/search/item' => 'v2/item',
    ],
    'extraPatterns' => [
        'PUT,PATCH <id:[\w-]+>/status' => 'update-status',
    ],
],
В таком случае запрос типа OPTIONS поступит на дефолтный экшн actionOptions класса yii\rest\ActiveController и тот обработает его нужным образом. Естественно Ваш контроллер должен быть унаследован от yii\rest\ActiveController.
Ответить