Posted on: July 25, 2023 05:26 PM
Posted by: Renato
Categories: Laravel jwt api auth auth authentication livros authorization ElonMusk multiple_authen
Views: 769
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
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.php
que 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
.env
arquivo com algo comoJWT_SECRET=foobar
.
Os casos de uso
Temos 3 tipos de usuários.
- Administradores
- Subadministradores
- 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
JWTSubject
contrato.
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.php
e 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 admins
, subadmins
e users
. Cada guarda tem um motorista e um modelo. A driver
configuração informa ao guarda para usar qual método para autenticar usuários (geralmente session
ou api
). A provider
configuraçã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 providers
seçã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.php
e 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.php
e adicione o seguinte ao $routeMiddleware
array.
'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
Donate to Site
Renato
Developer