Laravel Passport

Laravel Passport

200 Okunma Laravel Emir Gökkaya

Laravel Passport, laravel framework ile login işlemleri ile authentication işlemlerini sağlamaktadır. API authentication işlemleri için ise OAuth2 protokolünün tüm özelliklerini Laravel 5.4 ile birlikte gelen Passport servisi ile sağlamaktadır.

Not: Laravel Passport işlemini doğru bir şekilde anlamak için temel düzeyde OAuth2 protokolünün bilinmesi gerekmektedir. Linkten konu hakkında bilgi edinebilirsiniz.

 

Kurulum

Başlamak için Composer paket yöneticisi ile Passport'u yükleyelim,

composer require laravel/passport

Daha sonra migrate komutu ile oluşan tabloları database'e yükleyelim,

php artisan migrate

Şimdi passport:install komutunu çalıştırmamız gerekiyor. Bu komut access_token oluşturmak için gerekli olan şifreleme anahtarlarıdır.

php artisan passport:install

Bu komutu çalıştırdıktan sonra, Laravel/Passport/HasApiTokens özelliğini App/User modeline ekleyelim,

<?php

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

AuthServiceProvider içerisindeki boot metodunda Passport:routes değerini ekleyelim,

<?php

namespace App\Providers;

use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

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();
    }
}

 

Son olarak config/auth.php konfigrasyon dosyasında api kimlik doğrulama driver şeçeneğini passport olarak ayarlıyoruz,

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

Artık Laravel passport kullanarak API işlemlerimizi gerçekleştirebiliriz.

 

Örnek bir uygulama yapalım;

1. İlk önce artisan komutu ile book isminde bir tablo oluşturalım,

php artisan make:migration create_books_table

 

2. Bu işlemden sonra database/migrations dizini altında oluşan migrate tablomuza gidelim,

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('author');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('books');
}
}

 

3. Daha sonra terminal ekranından migrate işlemini gerçekleştirelim ve tablolarımızı database'e kaydedelim,

php artisan migrate

 

4. books tablomuz için bir model tanımlayalım,

php artisan make:model Book

 

5. Book modelimize gidelim ve fillable değerlerini belirtelim,

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'author'
];
}

 

6. Şimdi de artisan komutu ile bir controller oluşturalım

php artisan make:controller API/BookController
<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Book;
use Validator;

class BookController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$books = Book::all();
$data = $books->toArray();

$response = [
'success' => true,
'data' => $data,
'message' => 'Books retrieved successfully.'
];

return response()->json($response, 200);
}


/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->all();

$validator = Validator::make($input, [
'name' => 'required',
'author' => 'required'
]);

if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}

$book = Book::create($input);
$data = $book->toArray();

$response = [
'success' => true,
'data' => $data,
'message' => 'Book stored successfully.'
];

return response()->json($response, 200);
}


/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$book = Book::find($id);
$data = $book->toArray();

if (is_null($book)) {
$response = [
'success' => false,
'data' => 'Empty',
'message' => 'Book not found.'
];
return response()->json($response, 404);
}


$response = [
'success' => true,
'data' => $data,
'message' => 'Book retrieved successfully.'
];

return response()->json($response, 200);
}


/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Book $book)
{
$input = $request->all();

$validator = Validator::make($input, [
'name' => 'required',
'author' => 'required'
]);

if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}

$book->name = $input['name'];
$book->author = $input['author'];
$book->save();

$data = $book->toArray();

$response = [
'success' => true,
'data' => $data,
'message' => 'Book updated successfully.'
];

return response()->json($response, 200);
}


/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Book $book)
{
$book->delete();
$data = $book->toArray();

$response = [
'success' => true,
'data' => $data,
'message' => 'Book deleted successfully.'
];

return response()->json($response, 200);
}
}

 

7. Kayıt ve giriş işlemleri için de bir UserController oluşturalım, 

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\User;
use Validator;

class UserController extends Controller
{
/**
* Register api
*
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'c_password' => 'required|same:password',
]);

if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}

$input = $request->all();
$input['password'] = bcrypt($input['password']);
$user = User::create($input);
$success['token'] = $user->createToken('MyApp')->accessToken;
$success['name'] = $user->name;

$response = [
'success' => true,
'data' => $success,
'message' => 'User register successfully.'
];

return response()->json($response, 200);
}

/**
* Login api
*
* @return \Illuminate\Http\Response
*/
public function login()
{
if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')->accessToken;

return response()->json(['success' => $success], 200);
} else {
return response()->json(['error' => 'Unauthorised'], 401);
}
}
}

 

8. Son olarak routes/api.php dosyasından API yönlendirmelerimizi yapalım,

<?php

/*
|--------------------------------------------------------------------------
| 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', 'API\[email protected]');
Route::post('login', 'API\[email protected]');

Route::middleware('auth:api')->group( function () {
Route::resource('books', 'API\BookController');
});

Uygulamamızı Postman programı üzerinden test edelim,

Kayıt Olma

 

Giriş Yapma

 

 

Kitap Eklemek

 

Kitapları Görüntüleme

 

Belirli Bir Kitabı Görüntüleme

 

Kitap Güncelleme

 

Kitap Silme

 

Referanslarımızı incelemek ister misiniz?
Bitirmekten keyif aldığımız ve yeni tecrübeler kazandığımız projelerimiz.