diff --git a/Modules/Linksehat/Http/Controllers/Api/AuthController.php b/Modules/Linksehat/Http/Controllers/Api/AuthController.php index ee65a7df..f6205819 100644 --- a/Modules/Linksehat/Http/Controllers/Api/AuthController.php +++ b/Modules/Linksehat/Http/Controllers/Api/AuthController.php @@ -3,10 +3,12 @@ namespace Modules\Linksehat\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Models\Person; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; +use Laravel\Socialite\Facades\Socialite; use Modules\Linksehat\Transformers\UserProfileResource; use Validator; @@ -18,8 +20,8 @@ class AuthController extends Controller // 'phone' => 'required' 'phone_or_email' => 'required' ]); - - if(filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { + + if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) { $user = User::updateOrCreate([ 'email' => $request->phone_or_email ], [ @@ -27,8 +29,7 @@ class AuthController extends Controller 'otp' => rand(1000, 9999), 'otp_created_at' => now() ]); - } - else { + } else { $user = User::updateOrCreate([ 'phone' => $request->phone_or_email ], [ @@ -40,9 +41,9 @@ class AuthController extends Controller if (!$user) { return response()->json([ - 'message' => filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? - "User dengan alamat email ".$request->phone_or_email." tidak ditemukan" : - "User dengan nomor telepon ".$request->phone_or_email." tidak ditemukan" + 'message' => filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? + "User dengan alamat email " . $request->phone_or_email . " tidak ditemukan" : + "User dengan nomor telepon " . $request->phone_or_email . " tidak ditemukan" ], 404); } @@ -60,7 +61,7 @@ class AuthController extends Controller ] ]); } - + public function login(Request $request) { $request->validate([ @@ -76,14 +77,14 @@ class AuthController extends Controller if ($loginType == 'email') { $user = User::query() - ->where('email', $request->phone_or_email) - ->first(); + ->where('email', $request->phone_or_email) + ->first(); } if ($loginType == 'phone') { $user = User::query() - ->where('phone', $request->phone_or_email) - ->first(); + ->where('phone', $request->phone_or_email) + ->first(); } if (!isset($user) || empty($user)) { @@ -115,7 +116,7 @@ class AuthController extends Controller 'email' => 'required|email|unique:users,email', 'password' => [ 'required', - 'confirmed', + 'confirmed', 'min:8', 'regex:/.*[0-9].*/', 'regex:/.*[a-z].*/', @@ -155,7 +156,7 @@ class AuthController extends Controller $request->validate([ 'phone_or_email' => 'required' ]); - + $user = User::where((filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone'), $request->phone_or_email)->first(); if ($user) { @@ -173,6 +174,44 @@ class AuthController extends Controller 'message' => 'User Tidak Ditemukan' ], 404); } + } + public function redirectSocialLogin($provider) + { + return Socialite::driver($provider)->redirect(); + } + + public function handleSocialLoginCallback(Request $request, $provider) + { + // get the provider's user. (In the provider server) + $providerUser = Socialite::driver($provider)->user(); + + // check if access token exists etc.. + // search for a user in our server with the specified provider id and provider name + $user = User::where('email', $providerUser->email)->first(); + + // // if there is no record with these data, create a new user + if (!$user) { + $user = User::query()->create([ + 'email' => $providerUser->email, + ]); + + $person = Person::query()->create([ + 'owner_user_id' => $user->id, + 'name' => $providerUser->name, + 'email' => $providerUser->email, + ]); + + User::query()->find($user->id)->update([ + 'person_id' => $person->id + ]); + } + + // // return the token for usage + return response([ + 'message' => 'Selamat Datang', + 'user' => UserProfileResource::make($user), + 'token' => $user->createToken('app')->plainTextToken + ]); } } diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index b120fd1a..f1890218 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -26,6 +26,8 @@ Route::prefix('linksehat')->group(function () { Route::post('mock-otp', [AuthController::class, 'mockOtp']); Route::post('login', [AuthController::class, 'login']); Route::post('register', [AuthController::class, 'register']); + Route::get('social-login/{provider}', [AuthController::class, 'redirectSocialLogin']); + Route::get('social-login/{provider}/callback', [AuthController::class, 'handleSocialLoginCallback']); // Route::get('articles', [ArticleController::class, 'index']); // Route::get('articles/id', [ArticleController::class, 'show']); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c3be2544..bf500999 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -21,6 +21,7 @@ class Kernel extends HttpKernel \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + \Illuminate\Session\Middleware\StartSession::class, ]; /** diff --git a/composer.json b/composer.json index 3cd6473f..a2ad5205 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^9.11", "laravel/sanctum": "^2.15", + "laravel/socialite": "^5.5", "laravel/tinker": "^2.7", "maatwebsite/excel": "^3.1", "nwidart/laravel-modules": "^9.0", diff --git a/composer.lock b/composer.lock index 562677ee..ba7ef8a6 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": "b90f9f090c04c5bbe673dadc0237e57d", + "content-hash": "d08dff996a3db932c1ac6127c81d2c82", "packages": [ { "name": "box/spout", @@ -1322,6 +1322,75 @@ }, "time": "2022-02-11T19:23:53+00:00" }, + { + "name": "laravel/socialite", + "version": "v5.5.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "ce8b2f967eead5a6bae74449e207be6f8046edc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/ce8b2f967eead5a6bae74449e207be6f8046edc3", + "reference": "ce8b2f967eead5a6bae74449e207be6f8046edc3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "league/oauth1-client": "^1.10.1", + "php": "^7.2|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Socialite\\SocialiteServiceProvider" + ], + "aliases": { + "Socialite": "Laravel\\Socialite\\Facades\\Socialite" + } + } + }, + "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": "2022-08-20T21:32:07+00:00" + }, { "name": "laravel/tinker", "version": "v2.7.2", @@ -1724,6 +1793,82 @@ ], "time": "2022-04-17T13:12:02+00:00" }, + { + "name": "league/oauth1-client", + "version": "v1.10.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth1-client.git", + "reference": "d6365b901b5c287dd41f143033315e2f777e1167" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167", + "reference": "d6365b901b5c287dd41f143033315e2f777e1167", + "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.10.1" + }, + "time": "2022-04-15T14:02:14+00:00" + }, { "name": "maatwebsite/excel", "version": "3.1.40", @@ -9126,5 +9271,5 @@ "php": "^8.0.2" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.3.0" } diff --git a/config/services.php b/config/services.php index 0ace530e..e1904897 100644 --- a/config/services.php +++ b/config/services.php @@ -31,4 +31,10 @@ return [ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + 'google' => [ + 'client_id' => env('GOOGLE_CLIENT_ID'), + 'client_secret' => env('GOOGLE_CLIENT_SECRET'), + 'redirect' => env('GOOGLE_REDIRECT_URI'), + ], + ];