Di tutorial kali ini, kita akan belajar bagaimana cara membuat autentikasi api di laravel menggunakan Json Web Token. Penjelasan singkatnya adalah setiap kita melakukan Request, kita harus memiliki token agar bisa mengaksesnya. Langsung saja seperti biasa, lakukan instalasi laravel dengan mengetik perintah
$ composer create-project — prefer-dist laravel/laravel NamaProject
Lalu jangan lupa setting .env sesuai dengan settingan database kalian.
Setelah install JWT Packagenya dengan mengetik perintah
$ composer require tymon/jwt-auth:dev-develop --prefer-source
Lalu buka config/app.php
Di bagian Provider tambahkan 1 baris code seperti ini
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
Di Bagian Aliases tambahkan 2 baris code seperti ini
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
Setelah itu publish JWT Packagenya dengan mengetik perintah
$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Lalu buat jwt-auth secretnya dengan mengetik perintah
$ php artisan jwt:secret
Setelah itu buka file Model User, lokasi filenya ada di
app/User.php buatlah seperti ini
namespace App;use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
use Notifiable;
/**
* 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',
];
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
}
Setelah itu, ketikkan perintah migrasi database untuk membuat tabel dengan perintah
$ php artisan migrate
Lalu buat UserController untuk membuat fungsi register dan login, dengan mengetik perintah
$ php artisan make:controller UserController
Setelah itu buka UserController di bagian folder
app/Http/Controller/UserController.php dan buka isi isi controller seperti ini
namespace App\Http\Controllers;use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class UserController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
try {
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 400);
}
} catch (JWTException $e) {
return response()->json(['error' => 'could_not_create_token'], 500);
}
return response()->json(compact('token'));
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
if($validator->fails()){
return response()->json($validator->errors()->toJson(), 400);
}
$user = User::create([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => Hash::make($request->get('password')),
]);
$token = JWTAuth::fromUser($user);
return response()->json(compact('user','token'),201);
}
public function getAuthenticatedUser()
{
try {
if (! $user = JWTAuth::parseToken()->authenticate()) {
return response()->json(['user_not_found'], 404);
}
} catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
return response()->json(['token_expired'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
return response()->json(['token_invalid'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['token_absent'], $e->getStatusCode());
}
return response()->json(compact('user'));
}
}
Setelah itu buat BookController untuk mengecek mengimplementasikan JWT Auth yang kita buat tadi dengan mengetik perintah
$ php artisan make:controller BookController
Setelah itu isi BookControllernya di folder app/Http/Controller/BookController.php
namespace App\Http\Controllers;use Illuminate\Http\Request;
use Auth;
class BookController extends Controller
{
public function book() {
$data = "Data All Book";
return response()->json($data, 200);
}
public function bookAuth() {
$data = "Welcome " . Auth::user()->name;
return response()->json($data, 200);
}
}
Setelah itu buat JwtMiddleware
dengan mengetik perintah
$ php artisan make:middleware JwtMiddleware
Setelah itu edit app/Http/Middleware/JwtMiddleware.php seperti di bawah ini
namespace App\Http\Middleware;use Closure;
use JWTAuth;
use Exception;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class JwtMiddleware extends BaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
try {
$user = JWTAuth::parseToken()->authenticate();
} catch (Exception $e) {
if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
return response()->json(['status' => 'Token is Invalid']);
}else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
return response()->json(['status' => 'Token is Expired']);
}else{
return response()->json(['status' => 'Authorization Token not found']);
}
}
return $next($request);
}
}
Setelah itu edit Kernel.php di app/http/Kernel.php di bagian $routeMiddleware tambahkan sebaris code berikut
'jwt.verify' => \App\Http\Middleware\JwtMiddleware::class,
Lalu buat routing di routes/api.php
Route::post('register', 'UserController@register');
Route::post('login', 'UserController@login');
Route::get('book', 'BookController@book');Route::get('bookall', 'BookController@bookAuth')->middleware('jwt.verify');
Route::get('user', 'UserController@getAuthenticatedUser')->middleware('jwt.verify')
Setelah itu ketik perintah
$ php artisan serve
Lalu cek di postman
Buka 2 link berikut ini dengan postman (jangan melakukan login terlebih dahulu)
localhost:8000/api/book
localhost:8000/api/bookall
Lalu lakukan registrasi dan login untuk mencoba akses localhost:8000/api/bookall dengan link registrasi localhost:8000/api/register
Setelah registrasi coba melakukan login dengan email dan password yang sudah di daftarkan dengan link localhost:8000/api/login, setelah itu kita akan mendapat token, token tersebut akan kita gunakan untuk mengakses localhost:8000/api/bookall
Setelah itu coba akses localhost:8000/api/bookall dengan menambahkan Bearer dan token di dalam header. Copy token yang di dapat saat melakukan login
Coba juga untuk mengakses localhost:8000/api/user untuk mendapatkan informasi data user yang sedang login
Sekian tutorial dari saya, semoga bermanfaat dan jika ada salah tolong di benarkan di komentar. Terimakasih~