<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\User;
use Exception;
use Illuminate\Http\JsonResponse;
use Laravel\Socialite\Facades\Socialite;
use Carbon\Carbon;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Log;
class GoogleAuthController extends Controller
{
public function redirectToGoogle(): JsonResponse
{
try {
$url = Socialite::driver('google')
->stateless()
->with([
'prompt' => 'select_account',
'access_type' => 'offline',
'response_type' => 'code',
'scope' => 'openid profile email'
])
->redirect()
->getTargetUrl();
return response()->json([
'status' => 'success',
'redirect_url' => $url
]);
} catch (Exception $e) {
Log::error('Lỗi Google Redirect: ' . $e->getMessage());
return response()->json([
'status' => 'error',
'message' => 'Lỗi kết nối Google: ' . $e->getMessage()
], 500);
}
}
public function handleGoogleCallback(): JsonResponse
{
try {
$googleUser = Socialite::driver('google')
->stateless()
->user();
// Ghi log để debug
Log::info('Thông tin user Google:', [
'id' => $googleUser->id,
'email' => $googleUser->email
]);
$user = User::updateOrCreate(
['email' => $googleUser->email],
[
'name' => $googleUser->name,
'google_id' => $googleUser->id,
'email_verified_at' => now(),
'password' => bcrypt(Str::random(16))
]
);
// Tạo token với Passport
$expiresAt = now()->addHour();
$tokenResult = $user->createToken('Google-Auth', [], $expiresAt);
$token = $tokenResult->token;
$token->expires_at = $expiresAt;
$token->save();
return response()->json([
'status' => 'success',
'message' => 'Đăng nhập Google thành công',
'data' => [
'user' => $user->only(['id', 'name', 'email']),
'access_token' => $tokenResult->accessToken,
'refresh_token' => $token->id,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse($token->expires_at)
->timezone('Asia/Ho_Chi_Minh')
->format('Y-m-d H:i:s')
]
]);
} catch (Exception $e) {
Log::error('Lỗi Google Callback: ' . $e->getMessage());
return response()->json([
'status' => 'error',
'message' => 'Lỗi xử lý đăng nhập Google: ' . $e->getMessage()
], 500);
}
}
}