'I am stuck at Unable to set cookie or session Laravel
None of the below methods is setting cookie. i tried defining the route in Routes/api.php also.And in case of session,dd(session()->get('access_token')); inside the session_login() method immaediately after setting session gives data.But in index() method, it gives null data. I am able to use the Symfony\Component\HttpFoundation\Cookie facade only, when using the direct facade use cookie; it shows error undefined type.So, i couldn't try the cookie::queue()similarly for session also, not able to try with use session facade. that's why i've commented it in the below code.How can i fix this? i've already gone through many links in internet. Any help is much appreciated.
controller
use Symfony\Component\HttpFoundation\Cookie;
//use Cookie;
use Illuminate\Support\Facades\Session;
//use Session;
class AuthController extends Controller
{
public function getCookie(Request $request){
$value = $request->cookie('access_token');
return $value;
}
public function login(Request $request)
{
$response = new Response();
$response->withCookie(cookie('access_token','abcd',60));
//Cookie::queue('access_token','abcd',60);
//Cookie::queue(Cookie::make('access_token','abcd',60)); --shows error Call to undefined method Symfony\Component\HttpFoundation\Cookie::queue()
return redirect('/getCookie');
}
public function session_login(Request $request)
{
session(['access_token'=>$token]);
return redirect('/');
}
public function index()
{
return session()->get('access_token');
}
}
Routes/web.php
Route::post('/signin', [AuthController::class,'login']);
Route::get('/getCookie',[AuthController::class,'getCookie']);
Route::get('/',[AuthController::class,'index']);
Config/session.php
<?php
use Illuminate\Support\Str;
return [
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => env('SESSION_CONNECTION', null),
'table' => 'sessions',
'store' => env('SESSION_STORE', null),
'lottery' => [2, 100],
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'path' => '/',
'domain' => env('SESSION_DOMAIN', null),
'secure' => env('SESSION_SECURE_COOKIE'), //also tried adding false to this
'http_only' => true,
'same_site' => 'lax',
];
.env file
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file //tried changing this to database also
SESSION_LIFETIME=120
SESSION_DOMAIN=mydomain.com
SESSION_SECURE_COOKIE=false
Solution 1:[1]
Use the Cookie facade and Cookie::queue() to set and Cookie::get() to get cookie values.
Stripped down (working) version of your controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cookie;
class AuthController extends Controller
{
public function getCookie()
{
$value = Cookie::get('access_token');
return $value;
}
public function login()
{
Cookie::queue('access_token', 'abcd', 600);
return redirect('/getCookie');
}
}
Head to /signin, a cookie access_token will be set with the value abcd. You'll be redirected to /getCookie, which will output abcd.
Routes used (routes/web.php):
Route::get('/signin', [AuthController::class,'login']);
Route::get('/getCookie',[AuthController::class,'getCookie']);
Edit: for session access use this Controller:
<?php
namespace App\Http\Controllers;
class AuthController extends Controller
{
public function getSession()
{
$value = session('access_token');
return $value;
}
public function login()
{
session(['access_token' => 'abcde']);
return redirect('/getSession');
}
}
with these routes:
Route::get('/signin', [App\Http\Controllers\AuthController::class, 'login']);
Route::get('/getSession', [App\Http\Controllers\AuthController::class, 'getSession']);
Again, head to /signin, a session will be set and you'll be redirected to /getSession, which prints out abcde.
Solution 2:[2]
In App\Http\Kernel:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
In App\Providers\RouteServiceProvider:
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
In RouteServiceProvider web.php uses web middlewareGroup and api.php uses api middlewareGroup. So, web middlewareGroup includes session and cookie middlewares, which are respond to work with them.
So, if you want to you use sessions and cookies in api.php, you need to add session and cookie middlewares to api middlewareGroup:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
],
];
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Mirafzal Shavkatov |
