<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wendel Lopes</title>
    <description>The latest articles on DEV Community by Wendel Lopes (@wenlopes).</description>
    <link>https://dev.to/wenlopes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F630900%2F2eacf9bf-a7a3-48b4-a062-c64324b1b65a.jpeg</url>
      <title>DEV Community: Wendel Lopes</title>
      <link>https://dev.to/wenlopes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wenlopes"/>
    <language>en</language>
    <item>
      <title>Laravel and JWT Authentication with custom model</title>
      <dc:creator>Wendel Lopes</dc:creator>
      <pubDate>Sun, 17 Jul 2022 18:19:48 +0000</pubDate>
      <link>https://dev.to/wenlopes/laravel-and-jwt-authentication-with-custom-model-4m3n</link>
      <guid>https://dev.to/wenlopes/laravel-and-jwt-authentication-with-custom-model-4m3n</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Before we start, this is the first article i write in english, so apologize for any mistakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, i will show you how to implement JWT authentication (using tymon/jwt-auth package) in a Laravel api, using a different model than the default (Users). At the end, a link to the repository will be available with the content of this article.&lt;/p&gt;

&lt;p&gt;Portuguese version: &lt;a href="https://dev.to/wenlopes/laravel-8-e-autenticacao-jwt-tymon-jwt-auth-com-model-customizada-2l7k"&gt;https://dev.to/wenlopes/laravel-8-e-autenticacao-jwt-tymon-jwt-auth-com-model-customizada-2l7k&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So let's go!&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Run this command to install the package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require tymon/jwt-auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Publish the lib config file in your config folder, with the command&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish - provider&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Tymon&lt;/span&gt;&lt;span class="se"&gt;\J&lt;/span&gt;&lt;span class="s2"&gt;WTAuth&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;roviders&lt;/span&gt;&lt;span class="se"&gt;\L&lt;/span&gt;&lt;span class="s2"&gt;aravelServiceProvider"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Finally, let's generate the JWT secret, running the command (This command will add &lt;strong&gt;JWT_SECRET&lt;/strong&gt; env in your &lt;code&gt;.env&lt;/code&gt; file)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan jwt:secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you have questions about this step, &lt;a href="https://jwt-auth.readthedocs.io/en/develop/laravel-installation/" rel="noopener noreferrer"&gt;this is the official link to package documentation&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Model configuration
&lt;/h2&gt;

&lt;p&gt;Now it's time to change our default model. For our example, let's use a Model called Employee.&lt;/p&gt;

&lt;p&gt;For this, we gonna make a migration to create a table in our database, with same name of the Model.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:migration create_employee_table &lt;span class="nt"&gt;--create&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;employee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Our employee migration will have the same user migration structure that comes with the Laravel installation, but it difference will be a new column called "job_title".&lt;br&gt;
Feel free to add new columns, but keep the "email" and "password" columns.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'employee'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'job_title'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Remove user migration and run&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create the Employee model&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:model Employee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Important: In Employee model, you may need to add the $table variable, because when we create a test user in database (a little later in this article), Laravel will try to find the table name in plural, and it will cause error. If you already created the table in plural (employees), ignore this step.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;protected &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'employee'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The next step is to implement JWTSubject and extends Authenticatable class (Laravel) in our Model Employee. Finally, this will be our model content.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Very well, its time to configure our authentication provider.  For that, you must access the &lt;strong&gt;config/auth.php&lt;/strong&gt; file and add the 'employess' index in 'providers' array, containing the driver (for this example, we are using Eloquent) and its Model (employee)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulef6pu5dkta3gfgptmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulef6pu5dkta3gfgptmp.png" alt="image" width="678" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's set the "api" guard as our application default. In the same file, access the "defaults" array and set the default guard to "api"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8a3nu9cmc5hv0a3w3md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8a3nu9cmc5hv0a3w3md.png" alt="image" width="410" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have finished our provider configuration and this should be the final content of &lt;strong&gt;config/auth.php&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Creating Controller and Route
&lt;/h2&gt;

&lt;p&gt;It's time to create an auth controller to test our implementation&lt;/p&gt;

&lt;p&gt;Create an controller called AuthController, with same content of this &lt;a href="https://jwt-auth.readthedocs.io/en/develop/quick-start/" rel="noopener noreferrer"&gt;link (official documentation from the package)&lt;/a&gt; and create a route in your &lt;code&gt;routes/api.php&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Controllers\AuthController&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth/login'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;AuthController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth.login'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To test our endpoint, lets create an employee in our database and use this data to authenticate&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;DatabaseSeeder&lt;/code&gt; file, insert this content in the &lt;code&gt;run&lt;/code&gt; method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;\App\Models\Employee&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Usuário de teste'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'usuario@teste.com.br'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'senha123'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'job_title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Gerente administrativo'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan db:seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, use an API client (Postman, Insomnia...) and consume the &lt;strong&gt;api/auth/login&lt;/strong&gt; login route, passing the email and password defined in the seeder. If everything work's fine, the result will be something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk1orw0ooahox8e6n6en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk1orw0ooahox8e6n6en.png" alt="image" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it's done! Your authentication with an custom model is working.&lt;/p&gt;

&lt;p&gt;You can find the repository with this implementation through this &lt;a href="https://github.com/WenLopes/laravel8-jwt" rel="noopener noreferrer"&gt;link&lt;/a&gt;. In the repository, i'm using Docker as infra, with Nginx, Mysql and Laravel in version 8. Also, i implemented the &lt;a href="https://refactoring.guru/pt-br/design-patterns/strategy" rel="noopener noreferrer"&gt;pattern Strategy&lt;/a&gt; to return failed authentication messages and expired token response (in this case, a new valid token is returned).&lt;/p&gt;

&lt;p&gt;So, that's all. If you have any questions, please comment and i will respond. Thank's for your attention.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>jwt</category>
      <category>authentication</category>
      <category>php</category>
    </item>
    <item>
      <title>Laravel 8 e Autenticação JWT (tymon/jwt-auth) com Model customizada</title>
      <dc:creator>Wendel Lopes</dc:creator>
      <pubDate>Fri, 14 May 2021 23:16:02 +0000</pubDate>
      <link>https://dev.to/wenlopes/laravel-8-e-autenticacao-jwt-tymon-jwt-auth-com-model-customizada-2l7k</link>
      <guid>https://dev.to/wenlopes/laravel-8-e-autenticacao-jwt-tymon-jwt-auth-com-model-customizada-2l7k</guid>
      <description>&lt;p&gt;Nesse artigo vou mostrar como implementar autenticação JWT (utilizando o pacote &lt;strong&gt;tymon/jwt-auth&lt;/strong&gt;) em uma API com Laravel 8, utilizando uma Model diferente da padrão (Users). Ao final do texto, vou disponibilizar o link para o repositório contendo a implementação dos passos deste artigo :)&lt;/p&gt;

&lt;p&gt;Então vamos lá!&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Execute o comando para instalar o pacote&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require tymon/jwt-auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Publique o arquivo de configuração da biblioteca para sua pasta config, com o comando&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish - provider&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Tymon&lt;/span&gt;&lt;span class="se"&gt;\J&lt;/span&gt;&lt;span class="s2"&gt;WTAuth&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;roviders&lt;/span&gt;&lt;span class="se"&gt;\L&lt;/span&gt;&lt;span class="s2"&gt;aravelServiceProvider"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Por fim, vamos gerar o JWT secret, utilizando o comando&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan jwt:secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Esse comando vai adicionar a variável JWT_SECRET no seu arquivo &lt;code&gt;.env&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em caso de qualquer dúvida sobre o &lt;br&gt;
processo de instalação, &lt;a href="https://jwt-auth.readthedocs.io/en/develop/laravel-installation/" rel="noopener noreferrer"&gt;acesse o link oficial do pacote&lt;/a&gt; com instruções para a instalação.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configuração da Model
&lt;/h2&gt;

&lt;p&gt;Como dito anteriormente, vamos utilizar uma Model diferente da Users para armazenar os dados de usuários. Em nosso caso, vamos criar uma nova Model chamada Employee. &lt;/p&gt;

&lt;p&gt;Para isso, vamos criar uma migration para criar uma tabela no nosso banco de dados com o mesmo nome da Model:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:migration create_employee_table &lt;span class="nt"&gt;--create&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;employee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nossa migration vai ter a mesma estrutura da migration de users que vem como padrão na instalação do Laravel, onde a única diferença será um campo a mais chamado "job_title". Fique a vontade para adicionar novas colunas, mas certifique-se que as colunas "email" e "password" serão criadas.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'employee'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'job_title'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Remova a migration para criação da tabela de users e rode as migrations&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Crie a Model Employee&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:model Employee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Obs: Adicione a variável $table na model, para passar o nome da tabela no singular, pois no momento de realizar a criação de usuário de teste (um pouco mais a frente nesse mesmo artigo), o Laravel vai por padrão tentar localizar a tabela no plural e vai ocasionar erro. Se você criou a tabela no plural (employees), pule o passo abaixo&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;protected &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'employee'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após a criação de nossa Model, vamos implementar a classe JWTSubject, implementando seus métodos. Além disso, vamos extender a classe Authenticatable do Laravel. No final, esse será o conteúdo de nossa Model&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Muito bem, agora que temos nossa Model devidamente criada e configurada, é hora de configurarmos nosso provider de autenticação. Para isso, acesse o arquivo config/auth.php e vamos adicionar o novo índice 'employess' no array 'providers', contendo o driver (em nosso caso, vamos utilizar o Eloquent) e a model desejada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulef6pu5dkta3gfgptmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulef6pu5dkta3gfgptmp.png" alt="image" width="678" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, no mesmo arquivo, vamos acessar o array "guards" e no array "api", vamos setar o driver "jwt" e o provider "employees" que acabamos de criar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrt7ynfngrduztgqdm4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrt7ynfngrduztgqdm4o.png" alt="image" width="520" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, vamos setar o guard "api" como o padrão de nossa aplicação. No mesmo arquivo, acesse o array "defaults" e defina o guard padrão como "api"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8a3nu9cmc5hv0a3w3md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8a3nu9cmc5hv0a3w3md.png" alt="image" width="410" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso, concluímos a configuração do nosso provider e o conteúdo final do arquivo config/auth.php será esse&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Criando o controller e rota
&lt;/h2&gt;

&lt;p&gt;Muito bem, agora que criamos e configuramos nossa Model, vamos criar o controller de autenticação para testar nossa implementação.&lt;/p&gt;

&lt;p&gt;Crie o controller AuthController, com o mesmo conteúdo apresentado nesse &lt;a href="https://jwt-auth.readthedocs.io/en/develop/quick-start/" rel="noopener noreferrer"&gt;link do site oficial do pacote&lt;/a&gt; e em seguida, crie a rota para realizar o login no arquivo &lt;code&gt;routes/api.php&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Obs: Não se esqueça que a partir da versão 8 do Laravel, o controller deve ser importado no arquivo de rotas&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Controllers\AuthController&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth/login'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;AuthController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth.login'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para testar nosso endpoint, vamos criar um registro na tabela employee e utilizar os dados para autenticar.&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;DatabaseSeeder&lt;/code&gt; , insira o seguinte conteúdo dentro do método &lt;code&gt;run&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;\App\Models\Employee&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Usuário de teste'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'usuario@teste.com.br'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'senha123'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'job_title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Gerente administrativo'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E na sequência execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan db:seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, utilize seu API client de preferência e consuma a rota de login &lt;strong&gt;api/auth/login&lt;/strong&gt;, informando o email e senha criado na seeder. Se tudo ocorreu bem, o resultado será como o abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk1orw0ooahox8e6n6en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk1orw0ooahox8e6n6en.png" alt="image" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E pronto, sua autenticação com model customizada está funcionando.&lt;/p&gt;

&lt;p&gt;Como disse anteriormente, você pode baixar o projeto com essa implementação através do meu repositório no Github (link abaixo). Nesse repositório, estou utilizando Docker para infraestrutura, contendo Nginx, Mysql e o Laravel em sua versão 8. Além disso, implementei o &lt;a href="https://refactoring.guru/pt-br/design-patterns/strategy" rel="noopener noreferrer"&gt;pattern Strategy&lt;/a&gt; para retornar mensagens em casos de erro de autenticação e/ou token expirado, onde no segundo caso, um novo token atualizado é retornado (estou preparando um novo artigo para abordar esse tema :).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/WenLopes/laravel8-jwt" rel="noopener noreferrer"&gt;Clique aqui e acesse o repositório&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então é isso pessoal, em caso de dúvidas, deixe nos comentários. Obrigado e até a próxima&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>jwt</category>
      <category>auth</category>
    </item>
  </channel>
</rss>
