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

Я использую Laravel для создания RESTful API. Я использую базовый 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 заголовок?

спасибо.

7 ответов


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

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

обратите внимание, что выше используется Auth:: onceBasic (), который по какой-то причине все еще отправляет заголовок "Set-Cookie". Согласно документам onceBasic auth является апатридом; возможно, 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() кажется хорошим подходом для API REST без состояния. Каждый запрос клиента аутентифицируется, и в этом подходе не используются файлы cookie сеанса.

nb. Другие маршруты не пойманы вышеуказанным фильтром и по-прежнему будут устанавливать куки (и отправлять заголовок "Set-Cookie"). Таким образом, это решение работает для общей ситуации API без состояния и stateful web access/admin.


чтобы отключить сеансы для всех маршрутов в контроллере 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.";
    }

}

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

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

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

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

вы можете ознакомиться здесь.


вам нужно создать свой фильтр, как follws в 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);
}

удалить 'Illuminate\Cookie\CookieServiceProvider', из своего providers массив app.в PHP. Это должно сделать трюк:)


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

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

чтобы иметь возможность использовать механизм, но разрешать переопределять набор файлов cookie, после долгой отладки я обнаружил, что в классе Middleware есть некоторый hardwiring, но с помощью магии фильтров вы можете отключить эту функцию прямо перед 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


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

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