Posted on: July 25, 2023 08:26 PM
Posted by: Renato
Categories: Laravel jwt api auth auth authentication livros authorization ElonMusk multiple_authen
Views: 918
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.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:secretIsso atualizará seu
.envarquivo 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
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 admins, subadminse users. Cada guarda tem um motorista e um modelo. A driverconfiguração informa ao guarda para usar qual método para autenticar usuários (geralmente sessionou api). A 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
Donate to Site
Renato
Developer