Полностью отключить 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'
);