Do not speak Portuguese? Translate this site with Google or Bing Translator
Multiple Authentication Guards for Laravel JWT

Posted on: July 04, 2023 09:51 PM

Posted by: Renato

Views: 842

Multiple Authentication Guards for Laravel RESTful APIs (JWT)

 

Mas se você é relativamente novo no Laravel, múltiplas autenticações permitem que diferentes classes de usuários acessem partes diferentes/semelhantes do mesmo aplicativo.

JSON Web Tokens são um método RFC 7519 aberto e padrão do setor para representar reivindicações com segurança entre duas partes. para saber mais sobre jwt ]

O Laravel fornece uma maneira muito fácil e conveniente de criar APIs RESTful.

Hoje vou falar sobre como implementar vários guardas de autenticação ao usar APIs. Digamos que nosso sistema tenha 2 usuários: administrador e usuário. E temos 2 tabelas separadas para eles: admins e users. Faremos guardas para as 2 classes de usuários e restringiremos diferentes partes de nosso aplicativo com base nesses guardas.

Estou assumindo que você já criou o projeto Laravel e tudo mais configurado como configuração do banco de dados, scaffolding de autenticação, etc.

Estou usando tymon/jwt-auth para implementação de JWT.

Criando migração para administradores

run the following command:

php artisan make:migration create_admins_table

now from database/migrations we will edit as follow:

...
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}

Migrate the database

run the following command:

php artisan migrate

Create Admin Model

run the following command:

php artisan make:model Admin

 

agora abra o arquivo de modelo em app/Admin.php e adicione o seguinte código:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class Admin extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * Guard for the model
     *
     * @var string
     */
    protected $guard = 'admin';

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'admins';

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

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

 

Add new Guard

Open config/auth.php file and make changes as follow:

<?php
.....
    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],
.....
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],

        'admin' => [
            'driver' => 'jwt',
            'provider' => 'admins',
        ],
    ],
..........
'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ]

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

 

Create Login Function

Agora, para o login de demonstração, estou usando 2 funções diferentes em um controlador. Cabe a você como você deseja usá-lo. A parte principal é quando você chama o método try:

<?php
......
......
public function loginUser(Request $request) {
  $credentials = $request->only('email', 'password');
  try {
      if (!$token = auth()->attempt($credentials)) {
          return response()->json(['success' => false, 'error' => 'Some Error Message'], 401);
      }
  } catch (JWTException $e) {
      return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
  }
  return $this->respondWithToken($token);
}
.....
public function loginAdmin(Request $request) {
  $credentials = $request->only('email', 'password');
  try {
      if (!$token = auth()->guard('admin')->attempt($credentials)) {
          return response()->json(['success' => false, 'error' => 'Some Error Message'], 401);
      }
  } catch (JWTException $e) {
      return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
  }
  return $this->respondWithToken($token);
}
.....
/**
 * Construct a json object to send to client
 * @param string token
 * @return Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
    return response()->json([
        'success' => true,
        'data' => [
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]
    ], 200);
}
......
......

lembre-se, api guard [config/auth.php] com usuários como provedor é definido como padrão, então não temos que encadear explicitamente o método guard, mas para admin, temos que encadear o método guard.

Configurando as rotas

adicione as seguintes rotas a routes/api.php :

<?php
  .....
  Route::middleware('auth:admin')->get('test/admin', function() {
  return response()->json(['foo' => 'bar', 'user' => auth()->user()]);
  });
   
  Route::middleware('auth:api')->get('test/user', function() {
  return response()->json(['foo' => 'bar', 'user' => auth()->user()]);
  });
  .....

 

Lidar com a solicitação do usuário não autenticado

faça as seguintes alterações em app/Exceptions/Handler.php :

<?php
   
  namespace App\Exceptions;
  ...
  class Handler extends ExceptionHandler
  {
  ...
  protected function unauthenticated($request, AuthenticationException $exception)
  {
  return response()->json(['success' => false, 'error' => $exception->getMessage()], 401);
  }
 

}

Parabéns!! Nós terminamos de configurar tudo. adicione alguns usuários às duas tabelas, execute o seguinte comando:

php artisan serve

e teste essas APIs usando um cliente como o Postman.

Fontes?:

multiple-authentication-guards-for-laravel-restful-apis-jwt-


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email