diff --git a/app/Http/Controllers/V1/Auth/SocialiteMediaController.php b/app/Http/Controllers/V1/Auth/SocialiteMediaController.php index 9c85989..80d01bb 100644 --- a/app/Http/Controllers/V1/Auth/SocialiteMediaController.php +++ b/app/Http/Controllers/V1/Auth/SocialiteMediaController.php @@ -5,6 +5,7 @@ use App\Http\Requests\V1\AuthenticateWithGoogleRequest; use App\Http\Resources\UserResource; use App\Models\User; +use GuzzleHttp\Exception\ClientException; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; use Illuminate\Validation\ValidationException; @@ -70,15 +71,67 @@ public function loginGithub(): JsonResponse public function callbackGoogle(): JsonResponse { - $googleUser = Socialite::driver('google')->stateless()->user(); - - return $this->extracted($googleUser); + try { + $googleUser = Socialite::driver('google')->stateless()->user(); + return $this->extracted($googleUser); + } catch (ClientException $e) { + $errorCode = $this->parseOAuthClientException($e, 'Google'); + if ($errorCode === 'invalid_grant') { + return response()->json([ + 'success' => false, + 'message' => 'The authorization code has expired or has already been used. Please try signing in again.', + 'error' => 'invalid_grant', + ], 400); + } + return response()->json([ + 'success' => false, + 'message' => 'Google authentication failed. Please try again.', + 'error' => $errorCode, + ], 400); + } catch (\Exception $e) { + Log::error('Google OAuth callback error: ' . $e->getMessage()); + return response()->json([ + 'success' => false, + 'message' => 'An unexpected error occurred during Google authentication.', + ], 500); + } } public function callbackGithub(): JsonResponse { - $githubUser = Socialite::driver('github')->stateless()->user(); - return $this->extracted($githubUser); + try { + $githubUser = Socialite::driver('github')->stateless()->user(); + return $this->extracted($githubUser); + } catch (ClientException $e) { + $errorCode = $this->parseOAuthClientException($e, 'GitHub'); + return response()->json([ + 'success' => false, + 'message' => 'GitHub authentication failed. Please try again.', + 'error' => $errorCode, + ], 400); + } catch (\Exception $e) { + Log::error('GitHub OAuth callback error: ' . $e->getMessage()); + return response()->json([ + 'success' => false, + 'message' => 'An unexpected error occurred during GitHub authentication.', + ], 500); + } + } + + private function parseOAuthClientException(ClientException $e, string $provider): string + { + $response = $e->getResponse(); + $rawBody = $response !== null ? (string) $response->getBody() : ''; + $responseBody = $rawBody !== '' ? json_decode($rawBody, true) : null; + $errorCode = is_array($responseBody) ? ($responseBody['error'] ?? 'oauth_error') : 'oauth_error'; + + Log::warning("{$provider} OAuth callback failed", [ + 'error' => $errorCode, + 'error_description' => is_array($responseBody) ? ($responseBody['error_description'] ?? null) : null, + 'status' => $e->getCode(), + ]); + + return $errorCode; } public function extracted($mediaUser): JsonResponse