From f8af8541f6d5eff72b11ce2e53dcca5a33e3144e Mon Sep 17 00:00:00 2001 From: Bayu Lukman Yusuf Date: Thu, 15 Jan 2026 11:32:30 +0700 Subject: [PATCH] google auth login --- .../Controllers/Auth/GoogleController.php | 82 ++++ .../Member/Auth/MemberAuthRepository.php | 44 +- composer.json | 1 + composer.lock | 442 +++++++++++++++++- config/services.php | 6 + resources/views/account/signin.blade.php | 5 + .../views/components/social-login.blade.php | 14 +- routes/web.php | 6 + 8 files changed, 574 insertions(+), 26 deletions(-) create mode 100644 app/Http/Controllers/Auth/GoogleController.php diff --git a/app/Http/Controllers/Auth/GoogleController.php b/app/Http/Controllers/Auth/GoogleController.php new file mode 100644 index 0000000..99e1007 --- /dev/null +++ b/app/Http/Controllers/Auth/GoogleController.php @@ -0,0 +1,82 @@ +memberAuthRepository = $memberAuthRepository; + } + + /** + * Redirect the user to the Google authentication page. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectToGoogle() + { + return Socialite::driver('google')->redirect(); + } + + /** + * Obtain the user information from Google. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function handleGoogleCallback() + { + try{ + $googleUser = Socialite::driver('google')->stateless()->user(); + // Log::info($googleUser); + + $email = $googleUser->email; + $name = $googleUser->name; + $google_id = $googleUser->id; + $avatar = $googleUser->avatar; + + // $user = User::updateOrCreate( + // ['email' => $googleUser->email], + // [ + // 'name' => $googleUser->name, + // 'google_id' => $googleUser->id, + // 'avatar' => $googleUser->avatar, + // ] + // ); + + $user = $this->memberAuthRepository->check(['email' => $email]); + + if (!$user) { + // auto register + $customer = $this->memberAuthRepository->register([ + 'email' => $email, + 'name' => $name, + ]); + + $user = $customer->user; + } + + + Auth::login($user, true); + + return redirect()->route('home')->with('info', __('signin.google_coming_soon')); + + } catch (\Exception $e) { + Log::error('Google callback failed: '.$e->getMessage()); + Log::info($e); + + return redirect()->route('login')->with('error', __('signin.google_failed')); + } + } +} diff --git a/app/Repositories/Member/Auth/MemberAuthRepository.php b/app/Repositories/Member/Auth/MemberAuthRepository.php index 8d962dd..15727a6 100644 --- a/app/Repositories/Member/Auth/MemberAuthRepository.php +++ b/app/Repositories/Member/Auth/MemberAuthRepository.php @@ -285,27 +285,33 @@ class MemberAuthRepository public function register($data) { - $user = $this->findUserByPhone($data["phone"]); - Log::info(["check user" => (array) $user]); - - - if ($user){ + $customer = null; - throw ValidationException::withMessages([ - "phone" => "Nomor telepon sudah terdaftar" - ]); + $phone = @$data["phone"]; + + if ($phone != null) { + $user = $this->findUserByPhone($phone); + Log::info(["check user" => (array) $user]); + + + if ($user){ + + throw ValidationException::withMessages([ + "phone" => "Nomor telepon sudah terdaftar" + ]); + } + + $phone = $data["phone"]; + $phone = trim($phone); + $phone = substr($phone,0,1) == "0" ? "62".substr($phone,1,strlen($phone)):$phone; + $phone = preg_replace("/[^0-9]/", "",$phone); + $phone_with_zero = "0" . substr($phone,2,strlen($phone)); + + $customer = Customer::where('phone', $phone)->orWhere('phone',$phone_with_zero)->first(); + + Log::info(["check customer" => (array) $customer]); } - $phone = $data["phone"]; - $phone = trim($phone); - $phone = substr($phone,0,1) == "0" ? "62".substr($phone,1,strlen($phone)):$phone; - $phone = preg_replace("/[^0-9]/", "",$phone); - $phone_with_zero = "0" . substr($phone,2,strlen($phone)); - - $customer = Customer::where('phone', $phone)->orWhere('phone',$phone_with_zero)->first(); - - Log::info(["check customer" => (array) $customer]); - $email = $data["email"]; @@ -344,7 +350,7 @@ class MemberAuthRepository $customer = Customer::create([ 'number' => $number, 'name' => $data['name'], - 'phone' => $data['phone'], + 'phone' => $data['phone'] ?? '08', 'email' => $data['email'] ?? null, 'referal' => $data['referral'] ?? null, 'company' => 'AGI', diff --git a/composer.json b/composer.json index 5a1275b..0c7d8ec 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ "awobaz/compoships": "^2.5", "cviebrock/eloquent-sluggable": "^12.0", "laravel/framework": "^12.0", + "laravel/socialite": "^5.24", "laravel/tinker": "^2.10.1", "spatie/laravel-activitylog": "^4.10" }, diff --git a/composer.lock b/composer.lock index 5918fc2..9078481 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c45f8518505261ba9310f5d71a43a88e", + "content-hash": "d0b608eb451d87c58e31559913a4b6db", "packages": [ { "name": "awobaz/compoships", @@ -719,6 +719,69 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v7.0.2", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + }, + "time": "2025-12-16T22:17:28+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.3.0", @@ -1598,6 +1661,78 @@ }, "time": "2025-03-19T13:51:03+00:00" }, + { + "name": "laravel/socialite", + "version": "v5.24.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613", + "reference": "5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613", + "shasum": "" + }, + "require": { + "ext-json": "*", + "firebase/php-jwt": "^6.4|^7.0", + "guzzlehttp/guzzle": "^6.0|^7.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "league/oauth1-client": "^1.11", + "php": "^7.2|^8.0", + "phpseclib/phpseclib": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8", + "phpstan/phpstan": "^1.12.23", + "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Socialite": "Laravel\\Socialite\\Facades\\Socialite" + }, + "providers": [ + "Laravel\\Socialite\\SocialiteServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", + "homepage": "https://laravel.com", + "keywords": [ + "laravel", + "oauth" + ], + "support": { + "issues": "https://github.com/laravel/socialite/issues", + "source": "https://github.com/laravel/socialite" + }, + "time": "2026-01-10T16:07:28+00:00" + }, { "name": "laravel/tinker", "version": "v2.10.1", @@ -2041,6 +2176,82 @@ ], "time": "2024-09-21T08:32:55+00:00" }, + { + "name": "league/oauth1-client", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth1-client.git", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/f9c94b088837eb1aae1ad7c4f23eb65cc6993055", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "guzzlehttp/psr7": "^1.7|^2.0", + "php": ">=7.1||>=8.0" + }, + "require-dev": { + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^2.17", + "mockery/mockery": "^1.3.3", + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5||9.5" + }, + "suggest": { + "ext-simplexml": "For decoding XML-based responses." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev", + "dev-develop": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth1\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Corlett", + "email": "bencorlett@me.com", + "homepage": "http://www.webcomm.com.au", + "role": "Developer" + } + ], + "description": "OAuth 1.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "bitbucket", + "identity", + "idp", + "oauth", + "oauth1", + "single sign on", + "trello", + "tumblr", + "twitter" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth1-client/issues", + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.11.0" + }, + "time": "2024-12-10T19:59:05+00:00" + }, { "name": "league/uri", "version": "7.5.1", @@ -2716,6 +2927,125 @@ ], "time": "2025-05-08T08:14:37+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.3", @@ -2791,6 +3121,116 @@ ], "time": "2024-07-20T21:41:07+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.48", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.48" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2025-12-15T11:51:42+00:00" + }, { "name": "psr/clock", "version": "1.0.0", diff --git a/config/services.php b/config/services.php index 6182e4b..5d89974 100644 --- a/config/services.php +++ b/config/services.php @@ -34,5 +34,11 @@ return [ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ], ], + 'google' => [ + 'client_id' => env('GOOGLE_CLIENT_ID'), + 'client_secret' => env('GOOGLE_CLIENT_SECRET'), + 'redirect' => env('GOOGLE_REDIRECT_URI'), + ], + ]; diff --git a/resources/views/account/signin.blade.php b/resources/views/account/signin.blade.php index 3d6016b..51fcdd0 100644 --- a/resources/views/account/signin.blade.php +++ b/resources/views/account/signin.blade.php @@ -21,6 +21,11 @@ href="{{ route('register') }}">Create an account + {{-- show error message --}} + @if (session('error')) +
{{ session('error') }}
+ @endif + {{-- show error message --}}
diff --git a/resources/views/components/social-login.blade.php b/resources/views/components/social-login.blade.php index e857e2c..b4c5af0 100644 --- a/resources/views/components/social-login.blade.php +++ b/resources/views/components/social-login.blade.php @@ -11,15 +11,17 @@
- - + + - diff --git a/routes/web.php b/routes/web.php index dd1e7af..fad6306 100644 --- a/routes/web.php +++ b/routes/web.php @@ -61,3 +61,9 @@ Route::group(['prefix' => '/login/email'], function () { Route::post('/verify', [LoginEmailController::class, 'verify'])->name('login-email.verify'); }); +// Google OAuth routes +Route::group(['prefix' => '/login/google'], function () { + Route::get('/', [App\Http\Controllers\Auth\GoogleController::class, 'redirectToGoogle'])->name('login.google'); + Route::get('/callback', [App\Http\Controllers\Auth\GoogleController::class, 'handleGoogleCallback'])->name('login.google.callback'); +}); +