LARAVEL SANCTUM

Posted on 2021-05-05 04:15:00

API AUTENTIFIKASIYA

İstifadə edəcəklərimiz:
 — Homestead
 — Composer
 — Laravel dokumentasiya
 — İstənilən İDE
 — Bash

Homestead

https://medium.com/media/c29fdd802417c2628780c4af68b19706/href

Homestead haqqında ayrıca məqaləm var, oradan ətraflı məlumat əldə edə bilərsiniz. Burada qeyd edim ki, bizim proyektin adı larasanctum_apiauth_template olacaq və local domenimiz sanctumlaravel.local qeyd edəcəyik. Domenin adına uyğun da verilənlər bazası yaradaq. Nəticədə hosts faylında domeni qeyd edirik
192.168.10.10 sanctumlaravel.local
adresinə uyğun və resources/homestead.yaml faylında da qeydlərimizi unutmuruq.

sites:
- map: sanctumlaravel.local
to: /home/vagrant/code/larasanctum_apiauth_template/public
databases:
- sanctumlaravel

Sonda init.bat edib vagrant up vəya əgər vagrant up əvvəldə etmişdinizsə vagrant reload --provision etməyi unutmayın.

Laravel yeni proyekt yaradırıq…

https://medium.com/media/49685e614773356671a864042abf7949/href

Homestead üzərindən vagrant ssh edib, daxil oluruq serverimizə. cd code/ edib keçirik code direktoriyasına. Orada composer vasitəsi ilə, laravelin dokumentasiyasına əsasən yeni proyekti yaradırıq:

composer create-project laravel/laravel larasanctum_apiauth_template

Biraz gözlədikdən sonra laravel proyektimiz tam install olur. Biz hal hazırda serverdə code direktoriyasında olduğumuza görə keçirik proyektimizin direktoriyasına. ( cd larasanctum_apiauth_template/ ). Sonra nano .env əmri ilə verilənlər bazasına qoşulmaq üçün məlumatları yazırıq.

DB_CONNECTION=mysql
DB_HOST=192.168.10.10
DB_PORT=3306
DB_DATABASE=sanctumlaravel
DB_USERNAME=homestead
DB_PASSWORD=secret

Laravel proyektimiz hazırdır və əgər yazdıqlarıma uyğun etdinizsə, sanctumlaravel.local domeninə keçdikdə laravel proyektinin standart ilkin səhifəsini görəcəyik. Verilənlər bazası ilə də bağlantı olmalıdır.

Laravel Sanctum paketini əlavə edirik proyektimizə…

https://medium.com/media/9c21aa2f8e8c70b2fe60c0287267d699/href

Hal hazırda virtual serverdə (vagrant ssh-la keçdiyim) code/larasanctum_apiauth_template direktoriyasındayıq. Elə bu direktoriyada növbəti əmri istifadə edərək proyektimizə sanctumun paketini əlavə edirik.

composer require laravel/sanctum

Laravelin rəsmi dokumentasiyasına əsasən biz paketi əlavə etdikdən sonra, müəyyən (config və migrasiya) faylları publish etməliyik. Publish etmək üçün komandamız:

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

Və budur nəhayət migrasiyanı işə salmalıyıq ki, verilənlər bazasında lazımı cədvəllər (APİ tokenlərin saxlanılması üçün cədvəl) yaradılsın.

php artisan migrate

Migrasiya bitdikdən sonra bizim proyektimiz artıq adının bir hissəsini doğruldur. Laravel + Sanctum artıq hazırdır. Təbriklər.

APİ Autentifikasiya

https://medium.com/media/1ae3cf38f906326346f0f8f4b293488d/href

…Biz hələdə proyektimizin direktoriyasındayıq (code/sanctumlaravel.local).

ApiResponser

İlk öncə ApiResponser.php faylını yaradıb daxilində sorğulara uğurlu və uğursuz cavablar üçün xüsusi şablon hazır edək. Bunun üçün, proyektimizdə app/Traits qovluğunu (direktoriyasını) yaradırıq. Hər halda siz bunu İDE vasitəsi ilə də edə bilərsiz. Bash terminalından etmək üçün olduğumuz direktoriyadan növbəti əmri yığırıq və onun da daxilində ApiResponser.php faylını yaradırıq.

mkdir app/Traits
touch app/Traits/ApiResponser.php

ApiResponser faylının daxilini sizə burada təqdim edirəm. Copy/Paste edə bilərsiniz özünüzə.

<?php

namespace App\Traits;


trait ApiResponser{

protected function success($data, string $message = null, int $code = 200){
return response()->json([
'status'=>'Success',
'message'=>$message,
'data'=>$data
], $code);
}

protected function error(string $message = null, int $code, $data = null){
return response()->json([
'status'=>'Error',
'message'=>$message,
'data'=>$data
],$code);
}
}

İzaha ehtiyac var? Suallarınızı facebook səhifəmizə vəya qrupumuza yazın.

Route-ları əlavə etməyin vaxtı gəldi. Route-ları biz routes/api.php faylına əlavə edəcəyik. Mən Routları da burada sizin üçün qeyd edim ki, rahat istifadə edə biləsiniz.

use App\Http\Controllers\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::post('/auth/register', [AuthController::class, 'register']);
Route::post('/auth/login', [AuthController::class, 'login']);

Route::group(['middleware' => ['auth:sanctum']], function () {
Route::get('/me', function (Request $request) {
return auth()->user();
});
});
Route::post('/auth/logout', [AuthController::class, 'logout']);

Daxilində istifadə etdiyimiz AuthController hələ yaradılmayıb, onu birazdan yaradacağıq. Beləliklə bizim APİ end-pointləri görmək üçün php artisan route:list yazmalıyıq.

http://sanctumlaravel.local/api/auth/login
http://sanctumlaravel.local/api/auth/logout
http://sanctumlaravel.local/api/auth/register
http://sanctumlaravel.local/api/me

AuthController yaradırıq.

https://medium.com/media/58a136113e6b163a798b2243f14eb568/href

Controller yaratmaq üçün bildiyiniz kimi Laraveldə növbəti əmri yığmalıyıq.

php artisan make:controller AuthController

Yaratdığımız kontroller üçün routlarımıza uyğun funksiyalar yaratmalıyıq.

IDE-də App\Http\Controllers\AuthController.php faylında kodumuzu yazırıq.
İlk öncə ApiResponser traitimizi qoşuruq ki, gələn sorğularımıza cavabı əvvəlcədən qeyd etdiyimiz formatda göndərə bilək. İlk yazacağımız funksiya register funksiyasıdır. Register funksiyasının qəbul edəcəyi parametr Request $request olacaq. $request->validate() ilə biz qaydaları qeyd edirik. Mütləq qeyd olunacaq parametlər name, email, pas

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
use ApiResponser; // Traiti qoşuruq
    // Qeydiyyat, bizi sistemə əlavə edir və Token göndərir.
public function register(Request $request){
// Qeydiyyat üçün tələblər
$attr = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);
        // User modeli ilə istifadəçi yaradırıq.
$user = User::create([
'name' => $attr['name'],
'password' => bcrypt($attr['password']),
'email' => $attr['email']
]);
        // Yaranan istifadəçi üçün token göndəririk.
return $this->success([
'token'=>$user->createToken('API Token')->plainTextToken
]);
}
    // Giriş, bizə Token göndərir
public function login(Request $request){
$attr = $request->validate([
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6'
]);
        // Əgər email vəya pass səhv olsa
if(!Auth::attempt($attr)){
return $this->error('Məlumatlar düzgün daxil edilməyib', 401);
}
        // Əgər email və password düz olarsa
return $this->success([
'token'=>auth()->user()->createToken('API Token')->plainText
]);

}
    // Çıxış, tokeni silir
public function logout(){
auth()->user()->tokens()->delete();

return $this->success([
'message'=>'Token silindi!'
]);
}
}

Kodu detallı izahını yazmıram. Ümid edirəm qeyd olunan kod kifayət qədər aydındır və sual yaranmayacaq. Lakin hər halda sual olarsa siz bizə sosial şəbəkələrdə vəya telegram qrupumuzda suallarınızı verə bilərsiz.

Demək olar ki, Laravel + Sanctum APİ Autentifikasiya hazırdır. Qalan bir məqam User modelinə HasApiTokens əlavə etməkdir. User modelini də sizinlə paylaşıram.

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
use HasFactory, Notifiable, HasApiTokens;

/**
* The attributes that are mass assignable.
*
*
@var array
*/
protected $fillable = [
'name',
'email',
'password',
];

/**
* The attributes that should be hidden for arrays.
*
*
@var array
*/
protected $hidden = [
'password',
'remember_token',
];

/**
* The attributes that should be cast to native types.
*
*
@var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}

Bizi digər platformalarda da izləməyi unutmayın. Facebook səhifəqrup| Youtube kanal|Telegram qrupkanal və bizim saytımız aytiqaqash.com

DÜZƏLİŞLƏR

Məqaləni yazarkən hələ postman vasitəsi ilə endpointlərimizi yoxlamamışdıq. Lakin yuxarıda qeyd olunan kodları mən test etmişdim. Hazır ki hissəsini yazmaq üçün bir daha test elədim. Təəssüf olsun ki, yenidən yoxlayarkən gözlədiyim nəticəni almadım və bir neçə dəyişiklik edəsi oldum.

Dəyişikliklər

Birincisi biz videonu yazarkən User modelinə HasApiTokens əlavə etməyi unutmuşduq, ilk öncə onu əlavə elədim.

İkinci edəcəyim isə validasiya zamanı əgər error olursa, response almağım idi, demək olar ki, bir bug kimi. Bunu aradan qaldırmaq üçün validationda cüzi dəyişikliklər etməli oldum.

Əsas dəyişiklik AuthController.php faylında olduğuna görə onun kodunu yenidən burada yerləşdirirəm.

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
use ApiResponser;

// Traiti qoşuruq

// Qeydiyyat, bizi sistemə əlavə edir və Token göndərir.
public function register(Request $request)
{
// Qeydiyyat üçün tələblər
$validator = Validator::make($request->all(),[
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);

if($validator->fails()){
return $this->error('Tələblər ödənmir!', 401, $validator->errors());
}else{
$attr = $request->all();
}

// User modeli ilə istifadəçi yaradırıq.
$user = User::create([
'name' => $attr['name'],
'password' => bcrypt($attr['password']),
'email' => $attr['email']
]);
// Yaranan istifadəçi üçün token göndəririk.
return $this->success( [
'token' => $user->createToken('API Token')->plainTextToken
],"Qeydiyyatdan keçdi");
}

// Giriş, bizə Token göndərir
public function login(Request $request)
{

$attr = $request->all();


$validator = Validator::make($attr,[
'email' => 'required|string|email',
'password' => 'required|string|min:6'
]);

if($validator->fails()){
return $this->error('Tələblər ödənmir!', 401, $validator->errors());
}else{
$attr = $request->all();
}


// Əgər email vəya pass səhv olsa
if (!Auth::attempt($attr)) {
return $this->error('Məlumatlar düzgün daxil edilməyib', 401);
}
// Əgər email və password düz olarsa
return $this->success([
'token' => auth()->user()->createToken('API Token')->plainTextToken
]);

}

// Çıxış, tokeni silir
public function logout()
{
auth()->user()->tokens()->delete();

return $this->success([
'message' => 'Token silindi!'
]);
}
}

Validator:make ilə qaydalarımızı qeyd edirik və requestdən gələnləri tələblərimizə uyğun yoxlayırıq. Sonra isə if funksiyası ilə yoxlayırıq. Əgər tələblərə uyğun gəlməyib fail oldusa cavab error olaraq “Tələblər ödənmir” mesajı ilə qayıtsın.

if($validator->fails()){
return $this->error('Tələblər ödənmir!', 401, $validator->errors());
}else{
$attr = $request->all();
}

Əks halda $attr veriləninə sorğumuzda olan məlumatın bir qismini ötürürük. Qalanı əvvəlki koda uyğun qalıb, bir neçə oxşar dəyişikliyi saymasaq. Analiz edib özünüz başa düşməyə çalışsanız sizin üçün çox xeyri olar.

Keçək postman yoxlamaya? Hər halda proyekti githabdan yükləyib kodu analiz edə bilərsiniz.

Biz sosial şəbəkələrdə:

Youtube: https://www.youtube.com/c/AyTiQaqaş
Facebook Qrup: https://www.facebook.com/groups/aytiqaqash
Facebook Səhifə: https://www.facebook.com/aytiqaqash
Telegram Qrup: https://t.me/aytiqaqashlar
Telegram Kanal: https://t.me/aytiqaqash
İnstagram: https://www.instagram.com/aytiqaqash/
Twitter: https://twitter.com/aytiqaqash
Discord: https://discord.gg/pq9RRTGhmk