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')->groupfunction () {
        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(nulltrans('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(nulltrans('api.logout.success'));
        }


        $userToken = Auth::guard('api')->user();

        if(!empty($user))
        {
            $userToken = $user->token();

            $userToken->revoke();

        }

        \Session::flush();
        return $this->toJson(nulltrans('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

Popular posts from this blog

API

Encryption and Decryption By PHP

Seeder