diff --git a/web/app/Http/Controllers/Auth/RegisterController.php b/web/app/Http/Controllers/Auth/RegisterController.php index ed1a5e0..71e2390 100644 --- a/web/app/Http/Controllers/Auth/RegisterController.php +++ b/web/app/Http/Controllers/Auth/RegisterController.php @@ -8,6 +8,8 @@ use App\Models\User; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; +use Request; +use Auth; class RegisterController extends Controller { @@ -50,7 +52,7 @@ class RegisterController extends Controller protected function validator(array $data) { return Validator::make($data, [ - 'name' => ['required', 'string', 'max:255'], + 'username' => ['required', 'string', 'max:16', 'unique:users'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); @@ -62,12 +64,37 @@ class RegisterController extends Controller * @param array $data * @return \App\Models\User */ - protected function create(array $data) + protected function create(Request $request) { - return User::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => Hash::make($data['password']), + + $data = Request::all(); + + if (Request::input('password') != Request::input('confirmation')) { + return Response()->json(['message'=>"Those passwords don't match!", 'badInputs'=>['password','confirmation']]); + } + + $valid = Validator::make($data, [ + 'username' => ['required', 'string', 'max:16', 'unique:users'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8'], ]); + + if ($valid->stopOnFirstFailure()->fails()) { + $error = $valid->errors()->first(); + $messages = $valid->messages()->get('*'); + return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); + } + + $user = new User; + $user->username = $data['username']; + $user->email = $data['email']; + $user->password = Hash::make($data['password']); + $user->save(); + + Auth::login($user); + Request::session()->regenerate(); + + return Response()->json('good'); + } } diff --git a/web/app/Http/Controllers/Controller.php b/web/app/Http/Controllers/Controller.php index 60ac0c6..d921cd8 100644 --- a/web/app/Http/Controllers/Controller.php +++ b/web/app/Http/Controllers/Controller.php @@ -5,14 +5,48 @@ namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; +use App\Http\Controllers\Controller; +use App\Providers\RouteServiceProvider; +use App\Models\User; +use Illuminate\Foundation\Auth\RegistersUsers; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Validator; use Illuminate\Routing\Controller as BaseController; +use Auth; +use Request; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; - function register() { - return Response()->json('lmao'); + public function __construct() + { + $this->middleware('guest'); + } + + public function login(Request $request) { + + $data = Request::all(); + + $valid = Validator::make($data, [ + 'username' => ['required', 'string'], + 'password' => ['required', 'string'], + ]); + + if ($valid->stopOnFirstFailure()->fails()) { + $error = $valid->errors()->first(); + $messages = $valid->messages()->get('*'); + return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); + } + + if (!Auth::attempt(Request::only('username', 'password'))) { + return Response()->json(['message'=>'Sorry, thats the wrong password!', 'badInputs'=>['password']]); + } + + Request::session()->regenerate(); + + return Response()->json('good'); + } } diff --git a/web/app/Http/Kernel.php b/web/app/Http/Kernel.php index 7bc9cf6..45b7ccd 100644 --- a/web/app/Http/Kernel.php +++ b/web/app/Http/Kernel.php @@ -20,6 +20,8 @@ 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, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, ]; /** diff --git a/web/composer.json b/web/composer.json index e1d843e..f3a54f6 100644 --- a/web/composer.json +++ b/web/composer.json @@ -11,6 +11,7 @@ "guzzlehttp/guzzle": "^7.0.1", "laravel/framework": "^8.54", "laravel/sail": "^1.12", + "laravel/sanctum": "^2.14", "laravel/tinker": "^2.5", "laravel/ui": "^3.3", "predis/predis": "^1.1" diff --git a/web/composer.lock b/web/composer.lock index 9729894..40784cc 100644 --- a/web/composer.lock +++ b/web/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": "c6a0e979567b55245388bdaffddfe2e4", + "content-hash": "a52c905d9f6deaf85235a92494c0600b", "packages": [ { "name": "asm89/stack-cors", @@ -1165,6 +1165,70 @@ }, "time": "2021-10-26T21:37:54+00:00" }, + { + "name": "laravel/sanctum", + "version": "v2.14.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "dc5d749ba9bfcfd68d8f5c272238f88bea223e66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/dc5d749ba9bfcfd68d8f5c272238f88bea223e66", + "reference": "dc5d749ba9bfcfd68d8f5c272238f88bea223e66", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^6.9|^7.0|^8.0|^9.0", + "illuminate/database": "^6.9|^7.0|^8.0|^9.0", + "illuminate/support": "^6.9|^7.0|^8.0|^9.0", + "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": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2022-02-16T14:40:23+00:00" + }, { "name": "laravel/tinker", "version": "v2.6.1", @@ -7927,5 +7991,5 @@ "php": "^7.3|^8.0" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/web/config/session.php b/web/config/session.php index ac0802b..dd900e1 100644 --- a/web/config/session.php +++ b/web/config/session.php @@ -46,7 +46,7 @@ return [ | */ - 'encrypt' => false, + 'encrypt' => true, /* |-------------------------------------------------------------------------- diff --git a/web/database/migrations/2021_12_16_011849_create_users_table.php b/web/database/migrations/2021_12_16_011849_create_users_table.php new file mode 100644 index 0000000..2a34f16 --- /dev/null +++ b/web/database/migrations/2021_12_16_011849_create_users_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('username'); + $table->string('email'); + $table->timestamp('email_verified_at')->default(null); + $table->string('password'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/web/resources/js/helpers/Auth.js b/web/resources/js/helpers/Auth.js index 073ce57..adc85ab 100644 --- a/web/resources/js/helpers/Auth.js +++ b/web/resources/js/helpers/Auth.js @@ -9,45 +9,40 @@ axios.defaults.withCredentials = true var url = Config.BaseUrl.replace('http://', ''); var protocol = Config.Protocol; -export async function CreateAccount(form) +export function CreateAccount(form) { - console.log(form.get('username')); - const finished = false; const body = form; + var badInputs = []; - await axios.post(`${protocol}apis.${url}/account/register`, body, {headers: {"Access-Control-Allow-Origin": "*"}}).then(res=>{ - console.log(res); - }).catch(error=>console.log(error)); - - return new Promise((resolve, reject)=>{ - - if (finished) { + return new Promise(async (resolve, reject)=>{ + await axios.post(`${protocol}apis.${url}/account/register`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content}}).then(data=>{ + const res = data.data; + if (res.badInputs.length >= 1) { + badInputs=res.badInputs; + resolve({message: res.message, inputs: res.badInputs}); + } resolve("good"); - }else{ - resolve({message: `bad`, inputs: [`username`]}); - } + }).catch(error=>{console.log(error);}); + }); } -export const LoginToAccount = async (form) => { +export const LoginToAccount = (form) => { - console.log(form.get('Username')); - - const finished = true; const body = form; - await axios.post(`${protocol}${url}/api/login`, body).then(res=>{ - console.log(body); - }).catch(error=>console.log(error)); + return new Promise(async (resolve, reject)=>{ - return new Promise((resolve, reject)=>{ - - if (finished) { + await axios.post(`${protocol}apis.${url}/account/login`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content}}).then(data=>{ + const res = data.data; + if (res.badInputs.length >= 1) { + badInputs=res.badInputs; + resolve({message: res.message, inputs: res.badInputs}); + } resolve("good"); - }else{ - reject({message: `bad`, inputs: [`username`]}); - } + }).catch(error=>{console.log(error);}); + }); } diff --git a/web/resources/js/pages/Auth/Login.js b/web/resources/js/pages/Auth/Login.js index a57e5b7..fb837d0 100644 --- a/web/resources/js/pages/Auth/Login.js +++ b/web/resources/js/pages/Auth/Login.js @@ -41,8 +41,8 @@ const LoginForm = (props) => { e.preventDefault(); SubmitLogin(new FormData(e.target)); }} class="fs"> - input == `username`)? `is-invalid` : ``)}`} placeholder="Username" name="Username"/> - input == `password`)? `is-invalid` : ``)}`} placeholder="Password" name="Password"/> + input == `username`)? `is-invalid` : ``)}`} placeholder="Username" name="username"/> + input == `password`)? `is-invalid` : ``)}`} placeholder="Password" name="password"/>