Прежде чем начать, нужно определить, будет ли ваше приложение лучше обслуживаться Laravel Passport или Laravel Sanctum. Если приложение необходимо для поддержки OAuth2, вам следует использовать Laravel Passport. Однако, если вы пытаетесь аутентифицировать одностраничное приложение, мобильное приложение или выдавать токены API, вам следует использовать Laravel Sanctum. Laravel Sanctum не поддерживает OAuth2; однако он обеспечивает гораздо более простой опыт разработки аутентификации API.
Laravel Passport предоставляет полную реализацию сервера OAuth2 для приложения Laravel. Passport построен на основе сервера League OAuth2.
Словарь терминов - https://oauth2.thephpleague.com/terminology/
Для авторизации через API можно воспользоваться официальным плагином - Passport (https://laravel.com/docs/8.x/passport)
Сперва установим плагин:
composer require laravel/passport
После чего выполним миграции:
php artisan migrate
Далее необходимо выполить artisan-команду passport:install
, которая сгенерирует ключи шифрования:
php artisan passport:install
Далее переходим в модель User, и добавляем Laravel\Passport\HasApiTokens
trait в модель App\Models\User:
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
Далее необходимо обновить AuthServiceProvider
:
namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use Laravel\Passport\Passport; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); if (! $this->app->routesAreCached()) { Passport::routes(); } } }
И ещё необходимо изменить драйвер в файле config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
Мы успешно установили Laravel Passport
Теперь можем приступить к созданию контроллера:
php artisan make:controller AuthController
В файле routes/api.php
добавим маршрут:
Route::post('login', 'AuthController@postLogin');
А вот и сам контроллер
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class AuthController extends Controller { public function postLogin(Request $request){ if(Auth::attempt($request->only('email','passport'))){ $user = Auth::user(); $token = $user->createToken('admin')->accessToken; return [ 'token' => $token, ]; } return response([ 'error' => 'Invalid Authorize' ], Response::HTTP_UNAUTHORIZED); } }
Для того чтобы протестировать и получить token в ответе, необходимо отправить post запрос, email и password по адресу:
http://localhost:8000/api/login
Сперва добавим маршрут авторизации
Route::post('register', 'AuthController@postRegister');
Далее в контроллере AuthController
добавим новый экшн postRegister
:
public function postRegister(Request $request){ $user = User::create( $request->only('name', 'email') + ['password' => Hash::make($request->input('password'))] ); return response($user, Response::HTTP_CREATED); }
Далее создадим класс Request для валидирования регистрационных данных:
php artisan make:request RegisterRequest
Находим данный файл, и внесём в него следующие изменения:
public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'password' => 'required', 'password_confirm' => 'required|same:password' ]; }