Do not speak Portuguese? Translate this site with Google or Bing Translator
Multi-User API Authentication Using Laravel JWT

Posted on: July 25, 2023 05:26 PM

Posted by: Renato

Views: 623

Multi-User API Authentication Using Laravel JWT

O desenvolvimento da API RESTful usando Laravel é bastante fácil. O Laravel fornece suporte integrado para desenvolvimento de API usando o Laravel Passport e um rico ecossistema com toneladas de pacotes torna o desenvolvimento muito fácil. Aqui vamos usar JWT para autenticação de API. JWT significa JSON Web Tokens. Você pode ler mais sobre o JWT aqui. https://jwt.io/

Começando Vamos começar instalando um novo aplicativo Laravel.

composer create-project --prefer-dist laravel/laravel multi-jwt-auth
Para usar JWT em laravel existe um pacote popular chamado jwt-auth criado por Sean Tymon. Vamos instalar esse pacote também.
composer require tymon/jwt-auth 1.0.*

Em seguida, publique o arquivo de configuração usando o comando

php crafter vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

Isso publicará um arquivo de configuração config/jwt.phpque permite configurar o básico deste pacote.

Agora precisamos definir uma chave secreta para a criptografia e descriptografia dos tokens JWT. Para isso, execute o comando artesão abaixo.

php artisan jwt:secret

Isso atualizará seu .envarquivo com algo comoJWT_SECRET=foobar

 

.

Os casos de uso

Temos 3 tipos de usuários.

  1. Administradores
  2. Subadministradores
  3. Usuários (usuários normais)

Vamos criar as migrações.

Agora execute as migrações.

php artisan migrate

Create corresponding models.

<?php
   
  namespace App;
   
  use Tymon\JWTAuth\Contracts\JWTSubject;
  use Illuminate\Notifications\Notifiable;
  use Illuminate\Contracts\Auth\MustVerifyEmail;
  use Illuminate\Foundation\Auth\User as Authenticatable;
   
  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',
  ];
   
  /**
  * 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 [];
  }
  }
 

Nota: Certifique-se de implementar o JWTSubjectcontrato.

Configurando o Auth Guard

jwt-auth funciona estendendo o sistema de autenticação do laravel. Portanto, precisamos configurar os guardas de autenticação.

Abra config/auth.phpe adicione esses guardas.

'guards' => [        'admins' => [
            'driver' => 'jwt',
            'provider' => 'admins',
        ],        'subadmins' => [
            'driver' => 'jwt',
            'provider' => 'subadmins',
        ],        'users' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
 ],

Agora vamos configurar os detalhes do provedor. Adicione-os à seção de provedores.

'providers' => [        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],        'subadmins' => [
            'driver' => 'eloquent',
            'model' => App\Subadmin::class,
        ],        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
],

O que é isso guardas realmente? 😇

Então, vamos entender o que essas configurações implicam.

O Laravel usa guardas para autenticação. Eles definem como o sistema deve armazenar e recuperar informações sobre seus usuários. Definimos 3 guardas adminssubadminsusersCada guarda tem um motorista e um modelo. driverconfiguração informa ao guarda para usar qual método para autenticar usuários (geralmente sessionou api). providerconfiguração indica em qual modelo o usuário está autenticado e o driver usado para a conexão com o banco de dados. Isso é configurado na providersseção.

Você também pode adicionar mais guardas se tiver mais hierarquias de usuários. Se você precisa saber mais sobre guardas confira este blog .

Agora vamos definir as configurações do jwt. Abra config/jwt.phpe defina a propriedade lock_user como true.

'lock_subject' => true,

O que isso faz é instruir o jwt a verificar se o usuário está autenticado na tabela correta. Isso é feito adicionando um valor de hash do nome da tabela ao token gerado.

Agora vamos criar um middleware personalizado para instruir o laravel a usar o guarda correto por rota. Execute o comando artesão abaixo para criar um middleware.

php artisan make:middleware AssignGuard

<?php
   
  namespace App\Http\Middleware;
   
  use Closure;
   
  class AssignGuard
  {
  /**
  * Handle an incoming request.
  *
  * @param \Illuminate\Http\Request $request
  * @param \Closure $next
  * @return mixed
  */
  public function handle($request, Closure $next, $guard = null)
  {
  if($guard != null)
  auth()->shouldUse($guard);
  return $next($request);
  }
  }

Para que o middleware funcione, precisamos registrá-lo. Para isso, vá para app/Http/Kernel.phpe adicione o seguinte ao $routeMiddlewarearray.

'assign.guard' => \App\Http\Middleware\AssignGuard::class,

Agora adicione o middleware às rotas.

<?php
   
  use Illuminate\Http\Request;
   
  /*
  |--------------------------------------------------------------------------
  | 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::group(['prefix' => 'admin','middleware' => ['assign.guard:admins','jwt.auth']],function ()
  {
  Route::get('/demo','AdminController@demo');
  });
   
  Route::group(['prefix' => 'subadmin','middleware' => ['assign.guard:subadmins','jwt.auth']],function ()
  {
  Route::get('/demo','SubadminController@demo');
  });
   
  Route::group(['prefix' => 'user','middleware' => ['assign.guard:admins','jwt.auth']],function ()
  {
  Route::get('/demo','UserController@demo');
  });

 é isso. Implementamos autenticação multiusuário usando jwt. Se você tiver alguma dúvida, sinta-se à vontade para perguntar na seção de comentários. Obrigado.

Fonte:

- https://medium.com/@JinoAntony/multi-user-api-authentication-using-laravel-jwt-8ae572b0c4cf

 


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (15) Variados (108) PHP (131) Laravel (161) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (27) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (55) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (6) reactnative (5) collections (1) javascript (6) reactjs (7) 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 (1) 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 (11) 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 (4) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (1) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (41) 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 (4) 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 (1) 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)

New Articles



Get Latest Updates by Email