我在部署在谷歌云运行上的 laravel firestore 项目中面临会话问题。在本地,一切正常,但它甚至无法在 Google 云上运行。
这是我的中间件
class FirestoreAuth {
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next) {
// Check if the 'user' session variable exists
if (!$request->session()->has('user')) {
session()->forget('user');
return redirect()->route('login'); // Redirect to login if not available
}
return $next($request); // Proceed to the next request
}
}
And User Controller login function
function login(Request $request){
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string|min:8',
]);
// Retrieve user from Firestore
$userCollection = $this->firestore->collection('users');
$query = $userCollection->where('deleted_at', '=', null)->where('email', '=', $request->email)->limit(1);
$userDocuments = $query->documents();
if ($userDocuments->isEmpty()) {
return redirect()->back()->withErrors(['email' => 'User not found.']);
}
$user = $userDocuments->rows()[0];
// Verify password
// dd($user->data()['password']);
if (Hash::check($request->password, $user->data()['password'])) {
// Create a session or token for the user
// You might want to use Laravel's built-in authentication or a custom session mechanism
// Here is a simple example of setting session data
$request->session()->put(['user' => $user->data(),'id' => $user->id()]); // Store user data in session
return redirect()->route('home')->with('success', 'Login successful!');
}
}
问题是,每当我尝试登录时,我都会被重定向回 google cloud run 上的登录。我已经输入了正确的凭据,但仍然被重定向到登录,因为会话没有用户密钥。也许该会话在 google cloud run 上不起作用。
session(['user' => $user->data(),'id' => $user->id()]); I also tried this way
注意:我也面临错误 419 页面已过期,但我删除了 verifycsrftoken 登录路由。
问题似乎是 Google Cloud Run 不支持每会话文件,因为该服务默认是无状态的。解决方案包括:
切换到 Redis 或 Firestore 进行会话:设置 SESSION_DRIVER=redis (或其他中央存储)
在.env中。 Redis 可以使用 Google 的 Memorystore 进行配置,或者 Firestore 可以与自定义设置一起使用。
SESSION_DRIVER=redis
REDIS_HOST=your-redis-host
REDIS_PASSWORD=your-redis-password
REDIS_PORT=6379
设置SESSION_DRIVER=cookie:如果Redis没有到位,请使用Cookie Sessions:将会话数据存储在加密的cookie中——对于较小的数据来说应该足够了。
设置安全配置:如果使用自定义域和 HTTPS,请确保 .env 中的 SESSION_DOMAIN 和 SESSION_SECURE_COOKIE=true。
检查 CSRF:即使在某些路由上禁用了 CSRF,也要确保您的表单包含 @csrf。
修改后刷新配置和缓存
php artisan config:cache
php artisan cache:clear