在Laravel 4 API停用所有Cookie(Fully disable cookies in

2019-09-02 03:45发布

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

谢谢。

Answer 1:

对于无状态的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访问/管理员的常见情况。



Answer 2:

若要在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.";
    }

}


Answer 3:

你需要在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);
}


Answer 4:

试试这个 - 肮脏的,但对我的作品。
的例子中,对于一个单一的途径,可以进行修改来管理路由前缀等。
首先,创建内部目录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';
});

你可能想看看这里 。



Answer 5:

删除'Illuminate\Cookie\CookieServiceProvider',从你的providersapp.php阵列。 它应该做的伎俩:)



Answer 6:

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



Answer 7:

您应修改session.php

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


文章来源: Fully disable cookies in Laravel 4 API