Do not speak Portuguese? Translate this site with Google or Bing Translator
Laravel Crie uma API autenticada JWT com Lumen

Posted on: January 04, 2022 10:22 AM

Posted by: Renato

Views: 911

Crie uma API autenticada JWT com Lumen

#php #lumen #laravel #webdev

Neste tutorial, usaremos lúmen; uma microestrutura super rápida da laravel para construir uma API REST simples e segura. No final deste tutorial, você será capaz de construir APIs prontas para produção. Vamos começar!

Pré-requisito

  • PHP >= 7.1.3
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Mysql >= 5.7
  • Composer (Dependency Manager for PHP)
  • Postman (To test your endpoints)

Instalação

Primeiro, você precisa obter o cli do lúmen.

$ composer global require "laravel/lumen-installer"

Se o download foi bem-sucedido, execute o comando abaixo para confirmar se o lúmen está instalado.

$ lumen

Agora execute este comando para criar o projeto lúmen

 

$ lumen new auth-app

Enter the project folder

$ cd auth-app

Run the app

$ php -S localhost:8000 -t public

Carregue o localhost: 8000 na barra de endereços do seu navegador e ele deve renderizar um resultado no navegador

Abra o projeto (auth-app) em seu editor preferido. * (VSCode)

Crie um arquivo .env, copie todo o conteúdo em .env.example para o arquivo .env e adicione suas configurações de banco de dados.

Em boostrap / app.php, descomente as fachadas e o método eloquente

//before

// $app->withFacades();

// $app->withEloquent();

//after

$app->withFacades();

$app->withEloquent();

Ativar com Facades injeta o aplicativo IoC em Illuminate \ Support \ Facades \ Facade. Sem fazer isso, mesmo se você estiver importando Illuminate \ Support \ Facades \ File, não funcionaria. Illuminate\Support\Facades\Facade. | Illuminate\Support\Facades\File

O método $ app-> withEloquent () também habilita o construtor de consultas. Ele está registrando o DatabaseServiceProvider, que é necessário para usar o construtor de consultas. Crédito.

Create a user

Faça a migração do banco de dados do usuário

$ php artisan make:migration create_users_table --create=users

Localize o arquivo de migração database/migrations /* _ create_users_table.php e adicione as colunas da tabela neede (nome, e-mail, senha); veja o código abaixo:

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

Migrate your database

$ php artisan migrate

Adicionar rota de registro que como o nome indica; registrar usuários. Localize routes/web.php e insira o código necessário conforme visto abaixo

// API route group
$router->group(['prefix' => 'api'], function () use ($router) {
   // Matches "/api/register
   $router->post('register', '[email protected]');

});

 

Como vamos prefixar api em todos os nossos terminais, para reduzir a repetição, usaremos o agrupamento de rotas para fazer exatamente isso.

Este método ($ router-> post ($ uri, $ callback); recebe um $ url e um parâmetro $ callback. No $ callback, AuthController é nossa classe de controlador (criaremos essa classe em breve) e o registro é um método nessa classe.

Vamos criar nosso AuthControler.

Crie o arquivo app / Http / Controllers / AuthController.php e preencha-o com o código conforme mostrado abaixo.


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use  App\User;

class AuthController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function register(Request $request)
    {
        //validate incoming request 
        $this->validate($request, [
            'name' => 'required|string',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed',
        ]);

        try {

            $user = new User;
            $user->name = $request->input('name');
            $user->email = $request->input('email');
            $plainPassword = $request->input('password');
            $user->password = app('hash')->make($plainPassword);

            $user->save();

            //return successful response
            return response()->json(['user' => $user, 'message' => 'CREATED'], 201);

        } catch (\Exception $e) {
            //return error message
            return response()->json(['message' => 'User Registration Failed!'], 409);
        }

    }


}

 

Registre um usuário (use POSTMAN) com rota localhost:8000/api/register e você deverá obter uma resposta bem-sucedida como esta

 

Lumen register example

Login do usuário

Puxe o pacote de autenticação JWT.

 

$ composer require tymon/jwt-auth:dev-develop

Generate your API secret

$ php artisan jwt:secret

create file config/auth.php with below config

//config.auth.php

<?php

return [
    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

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

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => \App\User::class
        ]
    ]
];

 

Faça algumas alterações em seu modelo de usuário (app / User.php) para se adequar aos requisitos de tymon / jwt-auth. Fique atento a tudo o que inclui "JWT".

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;


use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{
    use Authenticatable, Authorizable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email'
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];




    /**
     * 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 [];
    }
}

Make some changes to bootstrap/app.php

//before
// $app->routeMiddleware([
//     'auth' => App\Http\Middleware\Authenticate::class,
// ]);

//After
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);
//before
 // $app->register(App\Providers\AppServiceProvider::class);
 // $app->register(App\Providers\AuthServiceProvider::class);
 // $app->register(App\Providers\EventServiceProvider::class);

//After
 // $app->register(App\Providers\AppServiceProvider::class);
 $app->register(App\Providers\AuthServiceProvider::class);
 // $app->register(App\Providers\EventServiceProvider::class);

 // Add this line
 $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

Add login route in routes/web.php

// API route group
$router->group(['prefix' => 'api'], function () use ($router) {
     // Matches "/api/register
    $router->post('register', '[email protected]');

      // Matches "/api/login
     $router->post('login', '[email protected]');
});

Adicione um método respondWithToken global à classe Controller em app / Http / Controllers / Controller.php. Isso é para que possamos acessá-lo de qualquer outro controlador.

   ...
  //import auth facades
  use Illuminate\Support\Facades\Auth;


  //Add this method to the Controller class
  protected function respondWithToken($token)
    {
        return response()->json([
            'token' => $token,
            'token_type' => 'bearer',
            'expires_in' => Auth::factory()->getTTL() * 60
        ], 200);
    }

Add a login method to your AuthController class in app/Http/Controllers/AuthController.php

   ...

   //import auth facades
   use Illuminate\Support\Facades\Auth;

   ...

     /**
     * Get a JWT via given credentials.
     *
     * @param  Request  $request
     * @return Response
     */
    public function login(Request $request)
    {
          //validate incoming request 
        $this->validate($request, [
            'email' => 'required|string',
            'password' => 'required|string',
        ]);

        $credentials = $request->only(['email', 'password']);

        if (! $token = Auth::attempt($credentials)) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

Faça o login de um usuário usando a rota localhost:8000/api/login e você deverá obter uma resposta bem-sucedida como esta:

Lumen login example

.

Rotas autenticadas

Para o nosso grand finale, vamos fazer algumas rotas autenticadas.

Adicione algumas rotas a routes / web.php

...
// API route group
$router->group(['prefix' => 'api'], function () use ($router) {
    // Matches "/api/register
   $router->post('register', '[email protected]');
     // Matches "/api/login
    $router->post('login', '[email protected]');

    // Matches "/api/profile
    $router->get('profile', '[email protected]');

    // Matches "/api/users/1 
    //get one user by id
    $router->get('users/{id}', '[email protected]');

    // Matches "/api/users
    $router->get('users', '[email protected]');
});

...

Crie um arquivo app / Http / Controllers / UserController.php e preencha-o com este código de aparência elegante.

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use  App\User;

class UserController extends Controller
{
     /**
     * Instantiate a new UserController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Get the authenticated User.
     *
     * @return Response
     */
    public function profile()
    {
        return response()->json(['user' => Auth::user()], 200);
    }

    /**
     * Get all User.
     *
     * @return Response
     */
    public function allUsers()
    {
         return response()->json(['users' =>  User::all()], 200);
    }

    /**
     * Get one user.
     *
     * @return Response
     */
    public function singleUser($id)
    {
        try {
            $user = User::findOrFail($id);

            return response()->json(['user' => $user], 200);

        } catch (\Exception $e) {

            return response()->json(['message' => 'user not found!'], 404);
        }

    }

}


Below is an example call to one of the three newly added endpoints

Lumen users example

 

Espero que este artigo o tenha ajudado de alguma forma e que você aproveite esse conhecimento para implantar APIs incríveis no futuro próximo. Eu gostaria de ver suas contribuições nos comentários também.

 

Fonte:

https://github.com/ndiecodes/lumen-auth-example

https://dev.to/ndiecodes/build-a-jwt-authenticated-api-with-lumen-2afm

https://github.com/ricventu/laravel-firebase-jwt


4

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (12) Variados (108) PHP (102) Laravel (110) Black Hat (3) front-end (24) linux (82) postgresql (34) Docker (12) rest (4) soap (1) webservice (5) October (1) CMS (2) node (6) backend (10) ubuntu (38) devops (21) nodejs (4) npm (1) nvm (0) git (3) firefox (1) react (6) reactnative (5) collections (1) javascript (4) reactjs (7) yarn (0) adb (1) solid (0) blade (2) models (1) controllers (0) log (0) html (2) hardware (2) aws (14) Transcribe (2) transcription (1) google (3) ibm (1) nuance (1) PHP Swoole (4) mysql (22) macox (2) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (1) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (13) faceapp (1) eloquent (11) query (2) sql (35) ddd (3) nginx (6) apache (4) certbot (1) lets-encrypt (2) debian (9) liquid (1) magento (1) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (1) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (2) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (1) binaural (1) mysqli (3) database (32) windows (2) vala (1) json (2) oracle (1) mariadb (2) dev (12) webdev (23) s3 (4) storage (1) kitematic (1) gnome (2) web (1) intel (1) piada (1) cron (2) dba (12) lumen (1) ffmpeg (1) android (2) aplicativo (1) fedora (2) shell (3) bash (2) script (2) lider (1) htm (1) csv (1) dropbox (1) db (2) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (0) biologia (1) programming (20) performance (1) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (1) microg (1) iode (1) ssh (1) zsh (1) terminal (1) dracula (1) spaceship (1) mac (1) idiomas (1) laptop (1) developer (24) api (1) data (1) matematica (1) seguranca (2) 100DaysOfCode (5) hotfix (1) documentation (1) laravel (1) RabbitMQ (1) Elasticsearch (1) redis (1) Raspberry (3) Padrao de design (3) JQuery (0) angularjs (2) Dicas (7) kubenetes (1) vscode (1) backup (1) angular (1) servers (2) pipelines (1) AppSec (1) DevSecOps (2) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (1) security (1) translate (1) kube (1) iot (1) politica (1) bolsonaro (1) flow (1) podcast (1) Brasil (1)

New Articles



Get Latest Updates by Email