Laravel API Authentication: Passport Kullanımı

Murat Can Kuru
3 min readOct 9, 2020

--

Merhaba arkadaşlar bu yazımda API sistemlerimizi güvenlik ve kullanıcı bazlı ayrıştırabilmek için Laravel Passport Kullanımından bahsedeceğim. Login olmak için API sistemine istek atacağız ve bize token dönderecek. Bu tokeni header içerisinde kullanarak işlemlerimizi daha güvenli ve kullanıcı bazlı yapmamızı sağlayacak.

İlk olarak aşağıdaki kodu komut satırına uygulayarak composer aracılığı ile kuralım.

composer require laravel/passport

Kurulum tamamlandıktan sonra Laravel Passport’un ihtiyaç duyduğu tabloları kurmak için aşağıdaki kodu komut satırına uygulayın.

php artisan migrate

Daha sonra keylerimizin oluşması için aşağıdaki kodu komut satırına uygulayın. Ayrıca oluşan keyleri herhangi biryere not edebilirisinz.

php artisan passport:install

Yüklemeler tamamlandıktan sonra Kullanıcı işlemleri için kullandığımız Modelin içerisine gelerek;

use Laravel\Passport\HasApiTokens;

özelliğini tanımlıyoruz. Aşağıdaki gibi görünür;

<?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\Passport\HasApiTokens; #değişen alan

class User extends Authenticatable
{
use HasFactory, Notifiable, HasApiTokens; #değişen alan

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

/**
* 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',
];

public function accounts() {
return $this->hasMany(Account::class);
}
}

Daha sonra app/Providers/AuthServiceProvider dosyasını açın ve boot metodunu aşağıdaki gibi düzenleyin;

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport; #değişen alan
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
*
@var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];

/**
* Register any authentication / authorization services.
*
*
@return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes(); #değişen alan
//
}
}

Son olarak, Passport’un Token Guard’ını kullanarak API isteklerinin kimliğini doğrulamak için config/auth.php dosyasında guard array altında api array içinde driver alanını passport olarak değiştiriyoruz. Artık API kimlik doğrulaması için Passport kullanılacak.

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],

'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
],

Şimdi, login ve register işlemleri için controller dosyamızı oluşturalım. Aşağıdaki kodu komut satırına uygulayın;

php artisan make:controller API/AuthController

bu komut ile birlikte app/Http/Controllers dizini altında API klasörü ve AuthController.php dosyası oluşacaktır.

AuthController.php dosyasını açarak aşşağıdaki gibi login ve register fonksiyonları oluşturalım.

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
class AuthController extends Controller
{
//
public function register(Request $request) {
#validator kullanılmadı.
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),

]);
$accessToken = $user->createToken('authToken')->accessToken;

return response(['user' => $user, 'access_token' => $accessToken]);
}

public function login(Request $request) {
$data = $request->only("email", "password");

if (!auth()->attempt($data)) {
return response(['message' => 'Invalid Credentials']);
}
$accessToken = auth()->user()->createToken('authToken')->accessToken;

return response(['user' => auth()->user(), 'access_token' => $accessToken]);
}
}

createToken() metodu Token endpointine istek atmadan manuel olarak token oluşturmaya yarar.

Şimdi, rota işlemleri için routes/api.php dosyasını açarak aşağıdaki gibi düzenleyelim.

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post("/register", [\App\Http\Controllers\API\AuthController::class, "register"]);
Route::post("/login", [\App\Http\Controllers\API\AuthController::class, "login"]);

Postman uygulamasını kullanarak api isteklerimizi test edelim.

Buaraya kadar anladığınızı umuyorum. Gerisi hayal gücünüze kalmış. Login işlemi sonrasında Authorization sekmesine tıklayarak Bearer alanına access_token değerini yapıştırarak diğer işlemlerinizi güvenli bir şekilde yapabilirsiniz. Araştırdığım kaynaklardan edindiğim notlar daha detaylı bilgi için laravelin resmi dökümantasyonunu kullanabiliriniz.

--

--

Murat Can Kuru

Laravel/PHP ve Python. Öğrenmeyi ve ögrendiklerimi paylaşmayı seviyorum. Öğrenmeyi isteyen herkesin birbirine bir şeyler katabileceğine inanıyorum.