Полностью отключить куки в Laravel 4 API

Я использую Laravel для создания RESTful API. Я использую Basic HTTP Auth (Authenticate header) с этим фильтром:

Route::filter('auth', function()
{
    $credentials = ['email' => Request::getUser(), 'password' => Request::getPassword()];

    if (!Auth::once($credentials)) {
        $response   = ['error' => true, 'message' => 'Unauthorized request'];
        $code       = 401;
        $headers    = ['WWW-Authenticate' => 'Basic'];

        return Response::json($response, $code, $headers);
    }
});

Это работает, но затем Laravel пытается установить cookie для пользователя (отправляя заголовок Set-Cookie). Я попытался установить ключ конфигурации session.driver на array, только чтобы увидеть, что теперь он отправляет Set-Cookie: laravel_session=deleted штуковину.

Как я могу полностью отключить этот заголовок Set-Cookie?

Спасибо.


person Iso    schedule 07.05.2013    source источник
comment
Вы пробовали родной базовый фильтр аутентификации Laravel 4 auth.basic?   -  person Muhammad Usman    schedule 07.05.2013
comment
@ Usman Да, он работает почти так же, за исключением того, что отправляет заголовок ответа WWW-Authenticate, чего я не хотел. Он также устанавливает laravel_session cookie.   -  person Iso    schedule 07.05.2013
comment
Для справки в будущем — в Laravel 5 просто используйте массив для хранения сеансов и отключите поддержку файлов cookie в config/app.php. Не забудьте использовать artisan для очистки-компиляции.   -  person gidmanma    schedule 27.03.2015


Ответы (7)


Для API без сохранения состояния, без файлов cookie и чистых заголовков работает следующее:

Route::filter('auth.basic', function()
{
    Config::set('session.driver', 'array');
    return Auth::onceBasic();
});

Обратите внимание, что в приведенном выше примере используется Auth::onceBasic(), который по какой-то причине по-прежнему отправляет заголовок «Set-Cookie». Согласно документам, аутентификация OnceBasic не имеет гражданства; возможно, файл cookie отправляется для информационных целей, является побочным эффектом режима отладки или, возможно, это ошибка. В любом случае Config::set(...) по-прежнему требуется. Быстрый просмотр маршрутов с этим фильтром возвращает следующие заголовки:

HTTP/1.1 200 OK
Date: Wed, 12 Feb 2014 02:34:26 GMT
Server: Apache/2.4.6 (Ubuntu)
X-Powered-By: PHP/5.5.3
Cache-Control: no-cache
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Content-Type: application/json

Auth::onceBasic() кажется хорошим подходом для REST API без сохранения состояния. Каждый клиентский запрос аутентифицируется, и в этом подходе не используются файлы cookie сеанса.

обратите внимание Другие маршруты, которые не улавливаются вышеуказанным фильтром, по-прежнему будут устанавливать файлы cookie (и отправлять заголовок «Set-Cookie»). Таким образом, это решение работает для обычной ситуации как API без сохранения состояния, так и веб-доступа/администрирования с отслеживанием состояния.

person sebt    schedule 12.02.2014

Чтобы отключить сеансы для всех маршрутов в контроллере Laravel 4, установите параметр драйвера сеанса в конструкции класса:

<?php

class ExampleController extends BaseController {

    public function __construct()
    {
        Config::set('session.driver', 'array');
    }

    public function getExample()
    {
        return "This example response should have no session cookie.";
    }

}
person Paul Wenzel    schedule 17.03.2014

вам нужно создать свой фильтр, как показано в laravel 4, 4.2

Route::filter('no.session.cookie', function()
{
    Config::set('session.driver', 'array');
    Config::set('cookie.driver', 'array');
});

В laravel 5, 5.1 установите промежуточное ПО handle() следующим образом

public function handle($request, Closure $next){
  \Config::set('session.driver', 'array');
  \Config::set('cookie.driver', 'array');
 return $next($request);
}
person Rameez Rami    schedule 04.11.2015

Попробуйте это - грязно, но у меня работает.
Пример для одного маршрута, его можно изменить для управления префиксом маршрута и т. д.
Сначала создайте каталог внутри app/config для определенной среды, скажем, stateless .
Затем поместите файл session.php внутрь файла app/config/stateless с кодом, как показано ниже:

<?php
return array(
    'driver' => 'array'
);

Наконец, измените часть detectEnvironment в bootstrap/start.php:

$env = $app->detectEnvironment(function()
{
    if ($_SERVER['REQUEST_URI'] == '/your/route') return 'stateless';
});

Вы можете посмотреть здесь.

person matpop    schedule 11.11.2013

Удалите 'Illuminate\Cookie\CookieServiceProvider', из массива providers в app.php. Это должно сработать :)

person ipalaus    schedule 07.05.2013
comment
Нет, теперь у меня ReflectionException: «Файл cookie класса не существует» (в bootstrap/compiled.php). Похоже, это происходит от vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:20: $guard->setCookieJar($this->app['cookie']);. Спасибо за помощь! - person Iso; 07.05.2013
comment
Мммм... что произойдет, если вы удалите провайдера сеанса? Когда-то я делал этот трюк, но не могу вспомнить где! :( - person ipalaus; 07.05.2013
comment
То же самое происходит, но с «Класс-сеансом». Вы уверены, что удаление провайдера было правильным решением? - person Iso; 07.05.2013
comment
когда что-то в скомпилированном файле вызывает ошибки, может быть хорошей идеей очистить этот файл, например, с помощью artisan clear:compiled. - person imme; 08.05.2018

Я разрабатываю API с использованием laravel, поэтому определенно не хочу использовать файлы cookie. Однако я хочу использовать механизм сеансов для API, требующих аутентификации.

Итак, я использую sessions.driver = "file"

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

Итак, filters.php я создал следующий фильтр и добавил в качестве фильтра after моей группы маршрутов

/*
|--------------------------------------------------------------------------
| Custom Filter to remove the session cookie
|--------------------------------------------------------------------------
|
| By default, if session driver is other than `null` or `array`, it will
| create a cookie and pass the encrypted session id so that it can be used
| across web requests.
| However, since our application is an API, we dont need the cookie, but
| we still want to be able to use the session functionality, so to allow
| this, we just need to set the driver to `array` right before the 
| dispatcher gets to the point to add the session cookie.
| 
| This is the Laravel call stack
| \Illuminate\Session\Middleware::handle()
|   -> \Illuminate\Session\Middleware::addCookieToResponse()
|        -> \Illuminate\Session\Middleware::sessionIsPersistent()
|
| All session handling and file storage has happened before sessionIsPersistent()
| is called, so we are safe to add an `after` filter that will reset
| the driver in the configuration and thus preventing this specific
| cookie to be added, all other previously added cookies will be 
| kept (if any added) and thus sent as part of the response.
*/
Route::filter('session.cookie.remove', function(){
    // Has to be 'array' because null, will prevent from writing sessions
    Config::set('session.driver', 'array');
});

Примечание. единственный случай, когда этот фильтр не будет вызываться и, таким образом, создавать файл cookie, — это возникновение исключения. В этом случае вы также можете обновить конфигурацию своего обработчика ошибок (ошибка по умолчанию обработчик, если вы не перезаписали laravel). Чтобы переопределить, посмотрите на app/start/global.php

person AlphaZygma    schedule 13.10.2014

Вы должны изменить session.php:

<?php
return array(
    'driver' => isset($_SERVER['REQUEST_URI']) && (stripos($_SERVER['REQUEST_URI'], '/api') === 0) ? 'array' : 'native'
);
person undeadking    schedule 11.01.2014