10

我正在使用 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标头?

谢谢你。

4

7 回答 7

15

对于无状态 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() 似乎是无状态 REST API 的好方法。每个客户端请求都经过身份验证,并且在此方法中不使用会话 cookie。

注意。上述过滤器未捕获的其他路由仍将设置 cookie(并发送“Set-Cookie”标头)。因此,此解决方案适用于无状态 API 和有状态 Web 访问/管理的常见情况。

于 2014-02-12T02:47:21.997 回答
6

要禁用 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.";
    }

}
于 2014-03-17T21:04:03.043 回答
2

试试这个 - 很脏,但对我有用。
示例是针对单个路由的,可以修改为管理路由前缀等。
首先,在内部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';
});
于 2013-11-11T15:34:06.497 回答
2

您需要在 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);
}
于 2015-11-04T05:11:42.247 回答
0

'Illuminate\Cookie\CookieServiceProvider',app.php 中providers的数组中删除。它应该可以解决问题:)

于 2013-05-07T10:51:08.090 回答
0

我正在使用 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

于 2014-10-13T19:22:03.840 回答
-1

你应该修改session.php

<?php
return array(
    'driver' => isset($_SERVER['REQUEST_URI']) && (stripos($_SERVER['REQUEST_URI'], '/api') === 0) ? 'array' : 'native'
);
于 2014-01-11T05:59:40.427 回答