Do not speak Portuguese? Translate this site with Google or Bing Translator
Laravel Passport – Criar API REST com autenticação

Posted on: July 27, 2022 03:14 PM

Posted by: Renato

Views: 3175

Laravel Passport – Criar API REST com autenticação

Neste tutorial, veremos como usar a autenticação de passaporte laravel em seu aplicativo Laravel. Também construiremos um CRUD de Produto simples (Criar, Ler, Atualizar e Excluir) usando a Autenticação Laravel Passport .

O Laravel já fornece autenticação de formulários de login tradicionais, mas e se você quiser usar APIs? As APIs usam tokens para autenticar usuários, pois não usam sessões. Quando um usuário faz login via API, um token é gerado e enviado ao usuário que é usado para fins de autenticação. O Laravel fornece o Passport para trabalhar com API Authentication sem nenhuma dificuldade.

Vamos ver como configurar e configurar o Laravel Passport para autenticação de API e APIs RESTful em um aplicativo Laravel.

Criando um novo projeto

Vamos começar criando um novo projeto Laravel. Execute o seguinte comando para criar um novo projeto.

 

composer create-project --prefer-dist laravel/laravel passport

 

Instalar pacote

Precisamos instalar o pacote Laravel Passport através do gerenciador de dependências do compositor. Execute o comando a seguir para exigir o pacote.


composer require laravel/passport

 

Adicionando Passaporte Laravel

O Laravel Passport requer algumas etapas para ser configurado corretamente.

Provedor de serviço

Estou usando o Laravel 5.6, que é a versão mais recente do laravel no momento, que registra automaticamente o pacote usando a descoberta automática de pacotes. Se você estiver usando laravel 5.4 ou inferior , você precisa adicionar Service Provider no arquivo config/app.php . Portanto, abra o arquivo e adicione o Service Provider na matriz de provedores .

1
2
3
4
'providers' => [
    ....
    Laravel\Passport\PassportServiceProvider::class,
]

Migração e instalação

Configure as credenciais do banco de dados no arquivo .env . O Laravel Passport vem com migração para tabelas de passaporte que precisam estar em nosso banco de dados. As Migrações do Passport são usadas para armazenar tokens e informações do cliente. Execute o comando migration para migrar esquemas para seu banco de dados.

 

php artisan migrate

 

Em seguida, é necessário instalar o passaporte usando o comando abaixo. Ele gerará as chaves de criptografia necessárias para gerar tokens de acesso secretos.

Configurar passaporte

Nesta etapa, precisamos fazer alterações em nosso aplicativo Laravel para concluir a configuração do passaporte.

app/User.php

Adicione o trait Laravel\Passport\HasApiTokens ao seu modelo de usuário . Ele fornecerá alguns métodos auxiliares.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
namespace App;
 
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
 
class User extends Authenticatable
{
    use HasApiTokens, 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',
    ];
}

AuthServiceProvider

Adicione Passport::routeso método no método de inicialização do seu AuthServiceProvider . Ele irá gerar as rotas necessárias. É assim que o app/Providers/AuthServiceProvider.php ficará após as alterações.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
namespace App\Providers;
 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;
 
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];
 
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
 
        Passport::routes();
    }
}

config/auth.php

No arquivo config/auth.php , defina o driver para o passaporte.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
return [
    ....
 
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
 
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
 
    ....
]

Criar rota

Vamos criar rotas de API. Adicione rotas no arquivo routes/api.php .

1
2
3
4
5
6
7
8
Route::post('login', 'PassportController@login');
Route::post('register', 'PassportController@register');
 
Route::middleware('auth:api')->group(function () {
    Route::get('user', 'PassportController@details');
 
    Route::resource('products', 'ProductController');
});

Criar controlador para autenticação

Vamos configurar nossa lógica para Autenticação. Crie o Passport Controller executando o comando a seguir.

 

 

php artisan make:controller PassportController

 

Copie o conteúdo abaixo para app/Http/Controllers/PassportController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
 
namespace App\Http\Controllers;
 
use App\User;
use Illuminate\Http\Request;
 
class PassportController extends Controller
{
    /**
     * Handles Registration Request
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function register(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6',
        ]);
 
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);
 
        $token = $user->createToken('TutsForWeb')->accessToken;
 
        return response()->json(['token' => $token], 200);
    }
 
    /**
     * Handles Login Request
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = [
            'email' => $request->email,
            'password' => $request->password
        ];
 
        if (auth()->attempt($credentials)) {
            $token = auth()->user()->createToken('TutsForWeb')->accessToken;
            return response()->json(['token' => $token], 200);
        } else {
            return response()->json(['error' => 'UnAuthorised'], 401);
        }
    }
 
    /**
     * Returns Authenticated User Details
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function details()
    {
        return response()->json(['user' => auth()->user()], 200);
    }
}

Deixe-me explicar o que está acontecendo no código acima

No método de cadastro , validamos os dados da solicitação e, em seguida, criamos o usuário. Em seguida, criamos o token usando o método createToken e passando o nome como argumento. Por fim, retornamos o token em uma resposta JSON.

No método de login , tentamos autenticar usando os detalhes da solicitação. Em seguida, retornamos uma resposta apropriada com base no sucesso ou fracasso da tentativa.

No método de detalhes , simplesmente retornamos o modelo eloquente do usuário.

Criar produto CRUD

Vamos criar um produto CRUD. Execute o seguinte comando para criar o Modelo de Produto, Migração e Controlador.

php artisan make:model Product -mc

 

Ele criará um novo arquivo de migração de banco de dados create_products_table.php no diretório database/migrations . Atualize o método up para o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->string('name');
        $table->integer('price');
        $table->timestamps();
 
        $table->foreign('user_id')
            ->references('id')
            ->on('users');
    });
}

Agora, adicione uma propriedade preenchível ao modelo Product . Abra o arquivo Product.php no diretório do aplicativo .

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Product extends Model
{
    protected $fillable = [
        'name', 'price'
    ];
}

Agora, execute a migração do banco de dados.

php artisan migrate

 

Agora, vamos adicionar um método de relacionamento de produto no arquivo app/User.php .

1
2
3
4
public function products()
{
    return $this->hasMany(Product::class);
}

Abra o arquivo ProductController.php no diretório app/Http/Controllers . Copie o conteúdo abaixo para o Controlador de Produto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
 
namespace App\Http\Controllers;
 
use App\Product;
use Illuminate\Http\Request;
 
class ProductController extends Controller
{
    public function index()
    {
        $products = auth()->user()->products;
 
        return response()->json([
            'success' => true,
            'data' => $products
        ]);
    }
 
    public function show($id)
    {
        $product = auth()->user()->products()->find($id);
 
        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }
 
        return response()->json([
            'success' => true,
            'data' => $product->toArray()
        ], 400);
    }
 
    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'price' => 'required|integer'
        ]);
 
        $product = new Product();
        $product->name = $request->name;
        $product->price = $request->price;
 
        if (auth()->user()->products()->save($product))
            return response()->json([
                'success' => true,
                'data' => $product->toArray()
            ]);
        else
            return response()->json([
                'success' => false,
                'message' => 'Product could not be added'
            ], 500);
    }
 
    public function update(Request $request, $id)
    {
        $product = auth()->user()->products()->find($id);
 
        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }
 
        $updated = $product->fill($request->all())->save();
 
        if ($updated)
            return response()->json([
                'success' => true
            ]);
        else
            return response()->json([
                'success' => false,
                'message' => 'Product could not be updated'
            ], 500);
    }
 
    public function destroy($id)
    {
        $product = auth()->user()->products()->find($id);
 
        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }
 
        if ($product->delete()) {
            return response()->json([
                'success' => true
            ]);
        } else {
            return response()->json([
                'success' => false,
                'message' => 'Product could not be deleted'
            ], 500);
        }
    }
}

Teste

Agora, nossa lógica está completa, vamos começar a testar. Vamos testá-lo no servidor de desenvolvimento PHP, mas você pode usar o host virtual se quiser. Execute o comando a seguir para servir o aplicativo no servidor de desenvolvimento PHP.

 

php artisan serve

 

Agora, vamos testar nossos endpoints de API usando uma ferramenta de teste de API como Postman .

API de registro

Registro de autenticação de passaporte Laravel

API de login

Login de autenticação do passaporte Laravel

API de detalhes

Ao testar a API de detalhes ou qualquer API que exija que um usuário seja autenticado, você precisa especificar dois cabeçalhos. Você deve especificar o token de acesso como um token de portador no cabeçalho de autorização . Basicamente, você deve concatenar o token de acesso que recebeu após o login e registro com o Portador seguido de um espaço.

1
2
3
4
'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '. $accessToken,
]

Detalhes de autenticação do passaporte Laravel

API de índice de produtos

Índice de produtos de autenticação de passaporte

API da loja de produtos

Loja de produtos de autenticação de passaporte

API de exibição de produtos

Exibição do produto de autenticação de passaporte

API de atualização do produto

Atualização do produto de autenticação de passaporte

API de exclusão de produto

Exclusão do produto de autenticação do passaporte

 Entre em contato comigo e me contrate para projetos laravel.

 


5

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 1 Comments
  • Renato Lucena
    Renato Lucena - há 1 ano
    * Achei interessante https://jwt.io/

Blog Search


Categories

OUTROS (15) Variados (109) PHP (130) Laravel (157) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (26) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (54) devops (25) nodejs (5) npm (2) 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 (40) Kubernetes (2) 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 (1) jwt (4) security (2) translate (1) kube (1) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (2) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (2) Architecture (3) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (1) autorizacao (2) authentication (4) authorization (2) 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)

New Articles



Get Latest Updates by Email