Yazan

Metgesoft

Yayın Tarihi

2024-02-07 10:23:17

Laravel Sanctum Nedir?

Laravel sanctum mobil ve web uygulamalarında api ile kimlik doğrulamak için geliştirilmiş bir Laravel paketidir. Sanctum ile api tokenler oluşturup uygulamanızda kimlik doğrulama işlemlerini yapabilir tokenlara expire(son kullanma tarihi) atabilir tüm kullanıcı doğrulamalarını yönetebilirsiniz. Bu makalemizde Laravel Sanctum nasıl kullanılır bu konu üzerinde duracağız

Laravel Proje Kurulumu
composer create-project --prefer-dist laravel/laravel laravel-sanctum-tutorial

Laravel Sanctum Paketi Kurulumu
composer require laravel/sanctum​

Paket Dosyalarını Yayınlama
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"​

Migrationları Çalıştırma
php artisan migrate​

Bu işlemlerden sonra veritabanımızda personel_access_token adında bir tablo oluşmalıdır. İşlemleri tanımladıktan sonra User modelimize HasApiTokens parametresini ekliyoruz

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}​

Laravel projemizdeki Routes->api.php dosyamıza login ve register adında route'larımız oluşturuyoruz. 

Route::post('/auth/register', [AuthController::class, 'createUser']);
Route::post('/auth/login', [AuthController::class, 'loginUser']);​

Oluşturduktan sonra AuthController içine ilgili methodları tanımladıktan sonra token oluşturma işlemine geçiyoruz.

 public function createUser(Request $request)
    {
        try {
            $validateUser = Validator::make($request->all(),
                [
                    'name' => 'required',
                    'email' => 'required|email|unique:users,email',
                    'password' => 'required'
                ]);

            if($validateUser->fails()){
                return response()->json([
                    'status' => false,
                    'message' => 'validation error',
                    'errors' => $validateUser->errors()
                ], 401);
            }

            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make($request->password)
            ]);
            $token = $user->createToken(
                'token-name', ['*'], now()->addMinutes(2)
            )->plainTextToken;

            return response()->json([
                'status' => true,
                'message' => 'User Created Successfully',
                'token' => $token
            ], 200);

        } catch (\Throwable $th) {
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }
    }

 public function loginUser(Request $request)
    {
        try {
            $validateUser = Validator::make($request->all(),
                [
                    'email' => 'required|email',
                    'password' => 'required'
                ]);

            if($validateUser->fails()){
                return response()->json([
                    'status' => false,
                    'message' => 'validation error',
                    'errors' => $validateUser->errors()
                ], 401);
            }

            if(!Auth::attempt($request->only(['email', 'password']))){
                return response()->json([
                    'status' => false,
                    'message' => 'Email & Password does not match with our record.',
                ], 401);
            }

            $user = User::where('email', $request->email)->first();

            return response()->json([
                'status' => true,
                'message' => 'User Logged In Successfully',
                'token' => $user->createToken("API TOKEN")->plainTextToken
            ], 200);

        } catch (\Throwable $th) {
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }
    }

Kullanıcı kaydı sırasında token oluşturma işlemini yapıyoruz ve response olarak kullanıcıya bu token'ı gönderiyoruz. Bundan sonraki işlemlerde oluşturduğumuz routelarda auth:sanctum middleware'ı kullanıyoruz.

Route::get('/get-post', [AuthController::class, 'getPost'])->middleware(["auth:sanctum"]);​

Sonuç

Laravel sanctum
ile api kurulumunu gerçekleştirdik. Uygulama üzerinden yayınladığımız api'leri sanctum token yöntemi ile korumaya alıyoruz. Tokenları sınırsız yapmak yerine expire_at eklersek uygulamayı dışarıdan gelen saldırılara karşı daha korunaklı ve kullanıcı dostu haline getirebiliriz.