[[oktatas:web:back-end_framework:laravel:laravel_rest_api|< Laravel API]] ====== Laravel API Sanctum azonosítás ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Bevezetés ===== A Sanctum azonosítás alapértelmezetten rendelkezésre áll a Laravel projektekben. ===== AuthController ===== Hozzunk létre egy Auth kontrollert: php artisan make:controller AuthController Létrejön: Először használatba kell venni néhány névteret, majd szükség van 3 függvényre: //... use App\Models\User; use Illuminate\Support\facades\Auth; class AuthController extends Controller { public function register(Request $request) { $fields = $request->validate([ 'name' => 'required|string', 'email' => 'required|string|unique:users,email', 'password' => 'required|string|confirmed' ]); $user = User::create([ 'name' => $fields['name'], 'email' => $fields['email'], 'password' => bcrypt($fields['password']) ]); $token = $user->createToken('sajatToken')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response($response, 201); } public function login(Request $request) { if( Auth::attempt([ "name" => $request->name, "password" => $request->password ])) { $authUser = Auth::user(); $success[ "token" ] = $authUser->createToken( "myapptoken" )->plainTextToken; $success[ "name" ] = $authUser->name; return response( $success); }else { return response( "Hiba! A bejelentkezés sikertelen", [ "error" => "Hibás adatok" ]); } } public function logout( Request $request ) { $user = User::where('name', $request->name)->first(); $user->tokens()->where('id', $request->tokenId)->delete(); return response()->json(['message' => 'Kijelentkezve'], 200); } } Lássuk mit kell kliens oldalon küldeni egy token visszavonásához, azaz kijelentkezéshez. A token visszavonásához elég elküldeni az azonosítót. { "name": "janos", "tokenId": "47" } Úgy is működik, ha az egészet elküldöm: { "name": "janos", "token": "47|1OoO3Dn7Gf9YVq0cpuM3YpYZFsquG0HXqgpmsglZ" } * Elérhető validációk [[https://laravel.com/docs/9.x/validation#available-validation-rules|itt]]. * Token visszavonása: [[https://laravel.com/docs/9.x/sanctum#revoking-mobile-api-tokens|itt]]. ===== Routing ===== Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::post('/logout', [AuthController::class, 'logout']); ===== Regisztráció teszt ===== JSON tartalom, egy példa regisztrációhoz: { "name": "janos", "email": "janos@zold.lan", "password": "titok", "password_confirmation": "titok" } ===== Védelem beállítása ===== Azokat a végpontokat, ahol azonosítást szeretnénk, egyszerűen bemásoljuk a Route::group() metódus paramétereként érkező névtelen függvénybe. Route::get('employees', [EmployeeController::class, 'index']); Route::get('employees/{id}', [EmployeeController::class, 'show']); Route::group(['middleware' => ['auth:sanctum']], function () { Route::post('employees', [EmployeeController::class, 'store']); Route::put('employees/{id}', [EmployeeController::class, 'update']); Route::delete('employees/{id}', [EmployeeController::class, 'destroy']); }); Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); ===== Login ===== A következő JSON tartalmat küldjük el a belépéshez: { "name": "janos", "password": "titok" } ===== apiResource használata ===== Az útvonalak védelme beállítható egyetlen sorral, és használhatunk mellette kivételt is. Az **index** metódust **külön** tesszük, mivel annak nem szeretnénk azonosítást beállítani. //... Route::group(['middleware' => ['auth:sanctum']], function(){ Route::apiResource('employees', EmployeeController::class) ->except('index'); }); Route::get('employees', [EmployeeController::class, 'index']); Route::post('register', [AuthController::class, 'register']); Route::post('login', [AuthController::class, 'login']); Az except függvény azt mondja, hogy az index() függvény kivétel, azt itt nem határozzuk meg. * [[https://laravel.com/docs/9.x/controllers#api-resource-routes|apiResource dokumentáció]] ===== Link ===== * https://laravel.com/docs/8.x/sanctum (2022) * https://laravel.com/docs/9.x/sanctum (2022) * https://laravel.com/docs/10.x/sanctum (2023)