Дисциплины - Ресурсно-компонентное программирование

Основы разработки бэкенда на Laravel - Авторизация в API

Sanctum Laravel - это авторизация для API. Используется в бэкенд-приложениях.

Sanctum решает две проблемы: формирование API токена и аутентификации в приложении.

Установка и настройка

Сперва необходимо установить плагин с помощью  composer

composer require laravel/sanctum

Далее публикуем необходимые настройки:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Sanctum создаст нужную миграцию для хранения токенов. Миграцию необходимо выполнить:

php artisan migrate

Далее находим файл App\Http\Kernel.php и заменяем значение api

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

Model User

Далее открываем модель User, и вносим сюда следующие изменения:

use Laravel\Sanctum\HasApiTokens;
 
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

Middleware

Теперь для защиты маршрутов в API мы можем использовать middleware auth:sanctum:


Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Данный middleware уже используется в файле routes/api.php.. Впоследствии перепишем его, создав группу для middleware auth:sanctum

Request UserRequest

Валидировать данные, необходимые для регистрации пользователя будем с помощью класса UserRequest. Сперва создадим его:

php artisan make:request UserRequest

Внесем необходимые изменения в класс:


namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name'=>'required|string',
            'email'=>'required|string|unique:users|email',
            'password'=>'required|confirmed'
        ];
    }
}

Таким образом, со стороны фронта нужно будет отправить следующие request-ы: name, email, password, password_confirmation

Controller AuthController

Создадим контроллер AuthController

php artisan make:controller AuthController

Добавим метод регистрации register

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Http\Requests\UserRequest;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function register(UserRequest $r){
        $r['password'] = Hash::make($r->password);
        $user = User::create($r->all());
        $token = $user->createToken('myapptoken')->plainTextToken;
        $response = [
            'user'=>$user,
            'token' => $token
        ];
        return response()->json($response);
    }
}

Маршрутизация

Для настройки маршрутов сперва в файл routes/api.php подключим namespace к папке с контроллерами.

use App\Http\Controllers;

Теперь можем прописать нужные маршруты, разбив наши маршуты пока на две группы - открытые (public) и защищенные (protected) маршруты:


//public routes
Route::post('register', [Controllers\AuthController::class, 'register']);
    
//protected routes
Route::group(['middleware'=>['auth:sanctum']], function(){

});

Postmen

Для тестирования запросов на бэк воспользуемся postmen. В папке с приложением создадим папку с коллекцией Auth и добавим туда нужные запросы. Обратие внимание на Headers. В заголовках должен быть отправлен Accept со значением application/json. После выставления заголовков, можно переключиться на вкладку params и там заполнить нужные для авторизации поля. После нажатия на кнопку send, при успешной авторизации мы увидим в ответе объект пользователя и token:

После того, как мы получили token, мы можем использовать его для защищённых запросов. Скопируем значение токена, и добавим его в значение Bearer Token вкладки Auth

Login и logout

Добавим в контроллер AuthController экшн входа - login.

    public function login(Request $request){
        $user = User::where('email', $request->email)->first();
        if(!$user || !Hash::check($request->password, $user->password)){
            return response()->json([
                'message' => 'bad credits'
            ]);
        }
        $token = $user->createToken('myapptoken')->plainTextToken;
        $response = [
            'user' => $user,
            'token' => $token
        ];
        return response()->json($response);
    }

Экшн выхода logout:

    public function logout(Request $request)
    {
        auth()->user()->tokens()->delete();
        return response()->json(['message'=>'Logged out']);
    }

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться