atomjoy / apilogin
Laravel api authentication library.
v5.0.6
2024-02-11 14:48 UTC
Requires
- php: ^8.1
- atomjoy/proton: ^1.0
- laravel/framework: ^10.0
- spatie/laravel-permission: ^6.0
README
Multi guard authentication API with sessions in Laravel.
How to install
Install databases and update with composer.
# Update composer update # Create permissions migrations php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" # Then change the beginning of the permission migration file name to 2023_01_01_100000_create_permission_tables.php
Databases
# notifications, storage php artisan notifications:table php artisan storage:link # Create tables php artisan migrate # Refresh tables php artisan migrate:fresh
Add in User model
Add profil, address, notifications relations (required).
<?php namespace App\Models; use Atomjoy\Apilogin\Contracts\HasProfilAddress; use Atomjoy\Apilogin\Contracts\HasRolesPermissions; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; use HasProfilAddress, HasRolesPermissions; use HasRoles; /** * Model table. */ protected $table = 'users'; /** * Auth guard. */ protected $guard = 'web'; /** * Append user relations (optional). */ protected $with = ['profile', 'roles']; // ... }
Activation page
<?php use Atomjoy\Apilogin\Http\Controllers\ActivateController; # Email activation link route Route::get('/activate/{id}/{code}', [ActivateController::class, 'index'])->name('activation');
Run server
php artisan serve --host=localhost --port=8000
Routes prefix: /web/api
Routes in file routes/web.php
Validation request
Route params search in: src/Http/Requests
Overwrite email, translations, config
php artisan lang:publish
php artisan vendor:publish --tag=apilogin-config--force
php artisan vendor:publish --tag=apilogin-views --force
php artisan vendor:publish --tag=apilogin-lang --force
# Permissions seeder migrations
php artisan db:seed --class=ApiloginPermissionsSeeder
Default admin credentials
Change before running the migration. See migration file 2023_08_04_105808_create_admin_users_table.php.
// config/apilogin.php return [ // Admin users emails (email with dns mx) 'super_admin_email' => 'superadmin@gmail.com', 'admin_email' => 'admin@gmail.com', 'worker_email' => 'worker@gmail.com', // Admin users passsword 'super_admin_password' => 'Password123#', 'admin_password' => 'Password123#', 'worker_password' => 'Password123#', ]
Overwrite s3 disk (avatar, images upload), admin emails
Disable amazon S3 disk overwriting if you have it installed (optional).
// config/apilogin.php return [ // Disable Storage::disk s3 to public overwrite 'overwrite_disk_s3' => false, ]
Tests
Copy testsuite Apilogin from phpunit.xml
<testsuite name="Apilogin"> <directory suffix="Test.php">./vendor/atomjoy/apilogin/tests/Dev</directory> </testsuite>
Mysql user and db
CREATE DATABASE IF NOT EXISTS laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS laravel_testing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'toor' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO root@127.0.0.1 IDENTIFIED BY 'toor' WITH GRANT OPTION;
Comment fallback route
Chenge or comment the fallback route while testing!
<?php // Add login route Route::get('/login', function () { return view('vue'); })->name('login'); // Disable in testing if (!app()->runningUnitTests()) { // Vue catch all Route::fallback(function () { return view('vue'); }); }
2FA auth
Two factor auth redirection url (vue).
/login/f2a/{hash} /admin/login/f2a/{hash}
Run tests
php artisan test --stop-on-failure --testsuite=Apilogin
Local package Laravel composer.json
{ "repositories": [ { "type": "path", "url": "packages/atomjoy/apilogin" } ], "require": { "atomjoy/apilogin": "dev-main", } }
Notifications config
Run first: php artisan notifications:table
<?php use App\Models\User; use Atomjoy\Apilogin\Notifications\Contracts\NotifyMessage; use Atomjoy\Apilogin\Notifications\DbNotify; use Illuminate\Support\Facades\Route; Route::get('/', function () { $msg = new NotifyMessage(); $msg->setContent('Hello max your LINK_SIGNUP and LINK_SIGNIN link (Register LINK_SIGNUP).'); $msg->setLink('LINK_SIGNUP', 'https://example.com/signup', 'Sign Up'); $msg->setLink('LINK_SIGNIN', 'https://example.com/signin', 'Sign In'); $user = User::first(); $user->notify(new DbNotify($msg)); $user->notifyNow(new DbNotify($msg)); return $user->notifications()->offset(0)->limit(15)->get()->each(function ($n) { $n->formatted_created_at = $n->created_at->format('Y-m-d H:i:s'); }); });
LICENSE
This project is licensed under the terms of the GNU GPLv3 license.