Laravel 会话在 google cloud run 上不起作用(Laravel + firestore)

问题描述 投票:0回答:1

我在部署在谷歌云运行上的 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 登录路由。

php laravel google-cloud-platform google-cloud-run laravel-11
1个回答
0
投票

问题似乎是 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
© www.soinside.com 2019 - 2024. All rights reserved.