我使用Laravel建立一个RESTful API。 我使用基本HTTP验证( 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
头?
谢谢。
对于无状态的API,没有饼干和清洁头以下工作:
Route::filter('auth.basic', function()
{
Config::set('session.driver', 'array');
return Auth::onceBasic();
});
需要注意的是,以上是使用验证:: onceBasic()由于某种原因仍发送“设置Cookie”头。 根据该文档onceBasic AUTH是无状态的; 也许cookie将被用于提供信息发送,是调试模式的副作用,或者也许这是一个错误。 无论哪种方式配置::设置(...)仍然是必需的。 航线上的快速卷曲此过滤器返回如下标头:
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
验证:: onceBasic()似乎是一个无状态的REST API的好办法。 每个客户端请求进行身份验证,并没有会话cookie在这种方法中使用。
NB。 其他航线不受上述过滤器捕获并仍将设置Cookie(并发送“设置Cookie”标题)。 所以这个解决方案适用于无状态API和状态的Web访问/管理员的常见情况。
若要在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.";
}
}
你需要在laravel 4来创建过滤器一样follws,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);
}
试试这个 - 肮脏的,但对我的作品。
的例子中,对于一个单一的途径,可以进行修改来管理路由前缀等。
首先,创建内部目录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';
});
你可能想看看这里 。
删除'Illuminate\Cookie\CookieServiceProvider',
从你的providers
在app.php阵列。 它应该做的伎俩:)
我正在开发使用laravel的API,所以肯定我不想使用的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
您应修改session.php
:
<?php
return array(
'driver' => isset($_SERVER['REQUEST_URI']) && (stripos($_SERVER['REQUEST_URI'], '/api') === 0) ? 'array' : 'native'
);