{"id":28347,"date":"2021-06-08T17:36:00","date_gmt":"2021-06-08T14:36:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28347"},"modified":"2021-10-18T04:03:29","modified_gmt":"2021-10-18T01:03:29","slug":"autenticacao-de-aplicativo-movel-usando-token-no-laravel","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/autenticacao-de-aplicativo-movel-usando-token-no-laravel\/","title":{"rendered":"Autentica\u00e7\u00e3o de aplicativo m\u00f3vel usando token no Laravel"},"content":{"rendered":"<p>Voc\u00ea est\u00e1 usando o Laravel para o back-end do seu aplicativo m\u00f3vel? Se sim, ent\u00e3o provavelmente voc\u00ea est\u00e1 procurando uma solu\u00e7\u00e3o f\u00e1cil para a autentica\u00e7\u00e3o de seu aplicativo m\u00f3vel. Muitos usu\u00e1rios podem estar usando seu aplicativo m\u00f3vel e voc\u00ea deseja fazer autentica\u00e7\u00e3o para servir conte\u00fado aos usu\u00e1rios m\u00f3veis. Neste artigo, estudamos como fazer autentica\u00e7\u00e3o baseada em tokens no Laravel. Voc\u00ea tamb\u00e9m pode usar a mesma abordagem para autentica\u00e7\u00e3o REST API.<\/p>\n<p>Vamos integrar o <a href=\"https:\/\/laravel.com\/docs\/master\/sanctum\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Laravel Sanctum,<\/a> que \u00e9 um sistema de autentica\u00e7\u00e3o leve. Voc\u00ea pode consider\u00e1-lo um substituto para a autentica\u00e7\u00e3o baseada em OAuth.<\/p>\n<p>Ao usar o Sanctum, os tokens de API do usu\u00e1rio s\u00e3o armazenados no banco de dados. Este token deve ser enviado como <code>Bearer<\/code>token via <code>Authorization<\/code>cabe\u00e7alho de seu aplicativo m\u00f3vel para os endpoints da API Laravel. Esses tokens normalmente t\u00eam um tempo de expira\u00e7\u00e3o muito longo (anos).<\/p>\n<p>Dito isso, vamos dar uma olhada em como usar o Sanctum para autenticar aplicativos m\u00f3veis.<\/p>\n<h3>Instalar e configurar o Laravel Sanctum<\/h3>\n<p>Para come\u00e7ar, primeiro voc\u00ea precisa instalar um pacote Sanctum em seu aplicativo Laravel. Instale-o usando o comando:<\/p>\n<pre><code>composer require laravel\/sanctum<\/code><\/pre>\n<p>Depois disso, publique os arquivos de configura\u00e7\u00e3o e migra\u00e7\u00e3o do Sanctum executando o comando abaixo.<\/p>\n<pre><code>php artisan vendor:publish --provider=\"LaravelSanctumSanctumServiceProvider\"<\/code><\/pre>\n<p>Em seguida, execute o comando de migra\u00e7\u00e3o que criar\u00e1 uma <code>personal_access_tokens<\/code>tabela em seu banco de dados. Esta \u00e9 a tabela onde todos os tokens de API ser\u00e3o armazenados.<\/p>\n<pre><code>php artisan migrate<\/code><\/pre>\n<p>Por padr\u00e3o, cada solicita\u00e7\u00e3o no Laravel requer um token csrf. Em caso de falta deste token csrf, o Laravel n\u00e3o prossegue com o seu pedido. Quando se trata de gerar tokens de API usando Sanctum, precisamos pular o envio do token csrf. Para isso, adicione <code>sanctum\/token<\/code>rota \u00e0 <code>$except<\/code>vari\u00e1vel de <code>app\/Http\/Middleware\/VerifyCsrfToken.php<\/code>. Vou criar essa <code>sanctum\/token<\/code>rota nas pr\u00f3ximas etapas.<\/p>\n<pre><code>&lt;?php\n...\nclass VerifyCsrfToken extends Middleware\n{\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* The URIs that should be excluded from CSRF verification.\n\u00a0\u00a0\u00a0\u00a0\u00a0*\n\u00a0\u00a0\u00a0\u00a0\u00a0* @var array\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0protected $except = [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'sanctum\/token'\n\u00a0\u00a0\u00a0\u00a0];\n}<\/code><\/pre>\n<p>Para fins de autentica\u00e7\u00e3o, precisamos emitir um token para os usu\u00e1rios. Portanto, voc\u00ea deve usar <code>HasApiTokens<\/code>trait para o modelo de usu\u00e1rio da seguinte maneira.<\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppModels;\n...\nuse LaravelSanctumHasApiTokens;\n\u00a0\nclass User extends Authenticatable\n{\n\u00a0\u00a0\u00a0\u00a0use HasApiTokens, HasFactory, Notifiable;\n\u00a0\u00a0\u00a0\u00a0...\n}<\/code><\/pre>\n<h3>Emiss\u00e3o de tokens de API para autentica\u00e7\u00e3o<\/h3>\n<p>Para enviar um token do portador com o cabe\u00e7alho de autoriza\u00e7\u00e3o em cada solicita\u00e7\u00e3o, \u00e9 necess\u00e1rio primeiro emitir um token de API. Vou criar um m\u00e9todo que gera um token de API para cada usu\u00e1rio. Para emitir um token, voc\u00ea dever\u00e1 enviar o e-mail, a senha e o dispositivo de um usu\u00e1rio.<\/p>\n<p>Adicione a rota abaixo no <code>routes\/web.php<\/code><\/p>\n<pre><code>Route::post('\/sanctum\/token', 'APITokenController@create_token');<\/code><\/pre>\n<p>Em seguida, crie um controlador <code>APITokenController<\/code>pelo comando:<\/p>\n<pre><code>php artisan make:controller APITokenController<\/code><\/pre>\n<p>Defina o <code>create_token()<\/code>m\u00e9todo no controlador rec\u00e9m-criado da seguinte maneira.<\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppHttpControllers;\n\u00a0\nuse AppModelsUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\nuse IlluminateValidationValidationException;\n\u00a0\nclass APITokenController extends Controller\n{\n\u00a0\u00a0\u00a0\u00a0public function create_token(Request $request)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;validate([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'email' =&gt; 'required|email',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'password' =&gt; 'required',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'device_name' =&gt; 'required',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$user = User::where('email', $request-&gt;input('email'))-&gt;first();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (! $user ||! Hash::check($request-&gt;input('password'), $user-&gt;password)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'error' =&gt; 'The provided credentials are incorrect.'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return $user-&gt;createToken($request-&gt;input('device_name'))-&gt;plainTextToken;\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>O c\u00f3digo acima verifica primeiro as credenciais do usu\u00e1rio. Se as credenciais estiverem corretas, ele enviar\u00e1 em resposta um token em formato de texto simples. Aqui, estou recebendo valores de entrada considerando que ser\u00e3o enviados em um objeto JSON.<\/p>\n<p>Tente enviar uma solicita\u00e7\u00e3o POST com as credenciais do usu\u00e1rio e voc\u00ea deve receber o token de texto simples. Este token de API pode ser armazenado no dispositivo m\u00f3vel e usado em um cabe\u00e7alho ao enviar solicita\u00e7\u00f5es de API.<\/p>\n<p>No meu caso, eu uso a <a href=\"https:\/\/themewp.inform.click\/pt-pt\/extensao-cliente-rest-para-visual-studio-code\/\" title=\"extens\u00e3o Rest Client do c\u00f3digo VS\">extens\u00e3o Rest Client do c\u00f3digo VS<\/a> e minha solicita\u00e7\u00e3o <code>sanctum\/token<\/code>\u00e9 conforme mostrado na imagem abaixo.<\/p>\n<p>V\u00e1 at\u00e9 o banco de dados e voc\u00ea ver\u00e1 que seu token est\u00e1 armazenado na <code>personal_access_tokens<\/code>tabela.<\/p>\n<p>O Sanctum criar\u00e1 v\u00e1rios tokens sempre que voc\u00ea atingir a <code>sanctum\/token<\/code>rota com as credenciais corretas. Se voc\u00ea deseja revogar o token anterior, adicione a instru\u00e7\u00e3o abaixo antes da \u00faltima instru\u00e7\u00e3o de retorno do c\u00f3digo acima.<\/p>\n<pre><code>\/\/ Revoke previous tokens...\n$user-&gt;tokens()-&gt;delete();\n\u00a0\nreturn $user-&gt;createToken($request-&gt;input('device_name'))-&gt;plainTextToken;<\/code><\/pre>\n<p>Finalmente, proteja as rotas adicionando o <code>auth:sanctum<\/code>middleware da seguinte maneira.<\/p>\n<pre><code>Route::middleware('auth:sanctum')-&gt;get('\/products', function() {\n\u00a0\u00a0\u00a0\u00a0\/\/ write a code\n});<\/code><\/pre>\n<p>O middleware valida se o token \u00e9 recebido em um cabe\u00e7alho de autoriza\u00e7\u00e3o. Se o token da API estiver correto, apenas ele permitir\u00e1 prosseguir para a rota.<\/p>\n<p>Por exemplo, no c\u00f3digo VS, voc\u00ea pode enviar o token de API como um token de portador com o cabe\u00e7alho de autoriza\u00e7\u00e3o, conforme mostrado abaixo.<\/p>\n<p>Espero que voc\u00ea entenda como integrar a autentica\u00e7\u00e3o de aplicativos m\u00f3veis usando um token no Laravel. Eu gostaria de ouvir seus pensamentos e sugest\u00f5es na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/p>\n<h4>Artigos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-criar-um-blog-com-o-laravel\/\" title=\"Como criar um blog com o Laravel\">Como criar um blog com o Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/um-guia-para-adicionar-o-google-recaptcha-v3-ao-seu-site-laravel\/\" title=\"Um guia para adicionar o Google reCAPTCHA v3 ao seu site Laravel\">Um guia para adicionar o Google reCAPTCHA v3 ao seu site Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-fazer-upload-de-video-no-youtube-no-aplicativo-laravel\/\" title=\"Como fazer upload de v\u00eddeo no YouTube no aplicativo Laravel\">Como fazer upload de v\u00eddeo no YouTube no aplicativo Laravel<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste tutorial, estudamos como integrar a autentica\u00e7\u00e3o de aplicativos m\u00f3veis usando o Laravel como backend. Laravel Sanctum \u00e9 um pacote que<\/p>\n","protected":false},"author":1,"featured_media":21639,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[502],"tags":[848],"class_list":["post-28347","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/comments?post=28347"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/28347\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/21639"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=28347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=28347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=28347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}