Laravel 8 REST API with Passport Authentication
Stap 1 :
composer create-project --prefer-dist laravel/laravel blog
composer require laravel/passport
php artisan migrate
php artisan passport:install
Stap 2 :
app/Models/User.php
use Laravel\Passport\HasApiTokens;
use HasApiTokens
Stap 3 :
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
//'hash' => false,
],
],
Stap 4 :
routes/api.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ProductController;
/*
|--------------------------------------------------------------------------
| 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::prefix('v1')->group(function () {
Route::post('signUp', [AuthController::class, 'signUp'])->name('signUp');
Route::post('signIn', [AuthController::class, 'signIn'])->name('login');
Route::post('signOut', [AuthController::class, 'signOut'])->name('signOut');
Route::middleware('auth:api')->group( function () {
Route::resource('products', ProductController::class);
});
});
Stap 5 :
app/Http/Controllers/Api/ApiController.php
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;
class ApiController extends Controller
{
/**
* send response to user.
*
* @return json
*/
public function toJson($result = [], $message = '', $status = 1)
{
return response()->json([
'status' => $status,
'result' => !empty($result) ? $result : new \stdClass(),
'message' => $message,
]);
}
}
Stap 6 :
app/Http/Controllers/Api/AuthController.php
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Api\ApiController as ApiController;
use App\Models\User;
use App\Models\UserLogin;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Validator;
class AuthController extends ApiController
{
/**
* Register user.
*
* @param Request $request
*
* @return json
*/
public function signUp(Request $request)
{
$this->validate($request, [
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required'
]);
$user = new User();
$user->name = $request->name;
$user->email = $request->email;
$user->password = bcrypt($request->password);
\DB::beginTransaction();
if ($user->save()) {
$userDetail = User::where('id',$user->id)->first();
$user = \Auth::loginUsingId($userDetail->id);
$tokenResult = $user->createToken('MyApp')->accessToken;
\DB::commit();
//$this->userLogin($request, $user);
return $this->toJson([
'userDetail' => $userDetail,
'accessToken' => $tokenResult,
], trans('api.register.success'));
}
DB::rollback();
return $this->toJson(null, trans('api.register.error'), 0);
}
/**
* Login user.
*
* @param object $request
*
* @return json
*/
public function signIn(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required'
]);
$userDetail = User::where('email',$request->email)->first();
if (empty($userDetail)) {
return $this->toJson([], trans('api.login.invalid'), 0);
}
if (\Hash::check($request->password, $userDetail->password)) {
$user = \Auth::loginUsingId($userDetail->id);
$userDetail = User::where('id',$user->id)->first();
$tokenResult = $user->createToken('MyApp')->accessToken;
//$this->userLogin($request, $user);
return $this->toJson([
'userDetail' => $userDetail,
'accessToken' => $tokenResult,
], trans('api.login.success'), 1);
}
return $this->toJson([], trans('api.login.invalid'), 0);
}
/**
* Logout user
*
*/
public function signOut()
{
$user = Auth::guard('api')->user();
if (empty($user)) {
return $this->toJson(null, trans('api.logout.success'));
}
$userToken = Auth::guard('api')->user();
if(!empty($user))
{
$userToken = $user->token();
$userToken->revoke();
}
\Session::flush();
return $this->toJson(null, trans('api.logout.success'));
}
/**
* User login process.
*
* @param Request $request
* @param Request $user
*
* @return json
*/
private function userLogin(Request $request, $user)
{
// Logout from all other device
UserLogin::where([
'userId' => $user->id,
'isLogin' => 1,
])->update(['isLogin' => 0]);
$userLogin = new UserLogin();
$userLogin->userId = $user->id;
$userLogin->isLogin = '1';
$userLogin->fill($request->all());
$userLogin->save();
}
}
Stap 7 :
App/Exceptions/Handler.php
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
/**
* Create a response object from the given validation exception.
*
* @param \Illuminate\Validation\ValidationException $e
* @param \Illuminate\Http\Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function convertValidationExceptionToResponse(ValidationException $e, $request)
{
$path = explode('/', $request->path());
$isAjax = !empty($path[0]) && $path[0] == 'api' ? true : false;
if ($e->response) {
return $e->response;
}
return ($request->expectsJson() || $isAjax)
? $this->invalidJson($request, $e)
: $this->invalid($request, $e);
}
/**
* Convert a validation exception into a JSON response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\JsonResponse
*/
protected function invalidJson($request, ValidationException $exception)
{
$errors = collect($exception->errors())->first();
$message = '';
if (!empty($errors[0])) {
$message = $errors[0];
}
return response()->json([
'status' => 0,
'result' => new \stdClass(),
'message' => $message,
], 200);
}
}
Stap 8 :
resources/lang/en/api.php
<?php
/*
|--------------------------------------------------------------------------
| API Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
return [
'register' => [
'error' => 'There is some problem in signup',
'success' => 'You are sign up successfully.',
],
'login' => [
'success' => 'You are logged in successfully',
'inactive' => 'Your account is inactive',
'invalid' => 'Email or password is invalid',
'notfound' => 'Account not found'
],
'products' => [
'success' => 'Product get successfully',
'delete' => 'Product delete successfully',
'edit' => 'Product edit successfully',
'notfound' => 'Product not found'
],
'logout' => [
'success' => 'You are logged out successfully.'
],
];
Stap 9 :
http://localhost/blog/public/api/v1/signUp
http://localhost/blog/public/api/v1/signIn
http://localhost/blog/public/api/v1/signOut
http://localhost/blog/public/api/v1/products
Stap 10 :
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Api\ApiController as ApiController;
use App\Models\Product;
class ProductController extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$products = Product::all();
if($products->isNotempty()){
return $this->toJson([
'productDetail' => $products
], trans('api.products.success'),1);
}
return $this->toJson([
'productDetail' => []
], trans('api.products.notfound'),0);
}
}
Comments
Post a Comment