Como usar o Laravel Passport para autenticação REST API
No desenvolvimento da web de hoje, APIs ou serviços da web são muito populares. Durante o desenvolvimento de um aplicativo móvel, a API desempenha um papel de ponte para a passagem de dados entre o aplicativo móvel e a web. Manter as chamadas de APIs seguras e autenticadas é importante para proteger os dados que estão sendo transferidos entre aplicativos.
Neste artigo, estudamos o Passaporte Laravel que nos permite autenticar APIs. O Passport é construído na parte superior do servidor OAuth2, que é muito mais seguro na forma como é construído.
Ao lidar com as APIs, costumávamos enviar um token de acesso para verificar se a solicitação recebida é válida. Se for autorizado, apenas deve permitir a interação com o aplicativo. O passaporte Laravel fornece uma maneira conveniente de criar e verificar token em relação à chamada API.
Instalação
Para começar, presumimos que você instalou o Laravel em seu sistema. Para instalar o Passport, execute o comando abaixo no terminal.
composer require laravel/passport
O comando acima funcionaria com a última versão do Laravel. Se você estiver executando uma versão mais antiga, o comando será um pouco diferente dependendo da sua versão do Laravel. Por exemplo, se o Laravel 5.5 estiver instalado, seu comando deve ser:
composer require laravel/passport=~4.0
Este comando cria seu próprio diretório de migração de banco de dados. Essas migrações criarão tabelas que armazenam os clientes e tokens de acesso.
Em seu config/app.php
arquivo, registre o provedor de serviços do Passport na matriz de provedores.
config / app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Vamos executar a migração que criará as tabelas do banco de dados para o Passport.
php artisan migrate
Agora, se você for ao seu cliente de banco de dados, notará as novas tabelas criadas em seu banco de dados.
Em seguida, execute o comando abaixo que cria chaves de criptografia para gerar tokens de acesso seguro. O comando abaixo cria clientes de “acesso pessoal" e “concessão de senha” que estão sendo armazenados na tabela oauth_clients
.
php artisan passport:install
O usuário pode copiar esses tokens para as próximas etapas. Na verdade, veremos 2 maneiras de criar tokens de acesso. Uma é por meio de clientes de “concessão de senha” e outra é por autenticação de login.
Configuração de passaporte
Vá até os diretórios do Laravel e abra o AppUser
arquivo de modelo. Neste arquivo, precisamos adicionar LaravelPassportHasApiTokens
traço.
app / User.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Depois disso, temos que chamar o Passport::routes
método no boot
método de AuthServiceProvider
.
app / Providers / AuthServiceProvider.php
<?php
namespace AppProviders;
use LaravelPassportPassport;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'AppModel' => 'AppPoliciesModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
Por fim, no config/auth.php
arquivo, defina a opção ‘driver’ da proteção de autenticação ‘api’ como ‘passaporte’ da seguinte forma:
config / auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Crie a API REST e proteja-a com o Laravel Passport
O Laravel cria um arquivo routes/api.php
onde devemos declarar nosso endpoint de APIs REST. Podemos proteger nossa API adicionando o middleware auth:api
a ela.
routes / api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
Para vários endpoints, não precisamos adicionar middleware todas as vezes. Em vez disso, podemos fazer da seguinte maneira:
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Como nossos ‘produtos’ de endpoint são protegidos se o chamarmos diretamente sem o token de autorização, obteremos uma resposta ‘Não autenticado’.
Isso significa que, ao chamar a API, é essencial passar o token de autorização em cada solicitação. Portanto, o Passport verificará o token e retornará a resposta.
Gerar token de acesso para API
Existem várias maneiras de criar um token de acesso para o aplicativo. Veremos 2 deles para este tutorial.
Primeira opção
Em primeiro lugar, você deve fazer uma chamada para o / oauth / token com os parâmetros necessários e obterá o token em resposta.
Presumimos que você esteja usando uma biblioteca Guzzle HTTP para fazer solicitações de API. Digamos que você tenha outro projeto de onde está fazendo uma solicitação de API.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://laravel.dev',
]);
$response = $client->post('/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => '8qyKG7WKb3O3FZh2hUyEOZ3dAj5l9S5ljn2bdeJf',
'username' => '[email protected]',
'password' => 'my_password',
'scope' => '*',
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
O código acima retorna uma matriz que contém uma chave ‘access_token’. Os parâmetros client_id e client_secret que obtivemos quando executamos passport:install
. Você também pode obter esses detalhes na tabela de banco de dados ‘oauth_clients’.
Tente novamente do carteiro passando o access_token para o endpoint ‘produtos’ e devemos obter a resposta.
Na verdade, você precisa chamar esta API como a seguir:
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Segunda opçao
Na primeira opção, você deve saber client_id e client_secret para gerar seu token. Essa pode não ser uma maneira conveniente em alguns cenários. O Passport oferece outra opção para gerar token de acesso apenas por meio de credenciais de login.
Em nosso ApiController.php
adicione o método de login com solicitação de postagem e escreva o código abaixo nele.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
use IlluminateSupportFacadesAuth;
class ApiController extends Controller
{
public function login(){
if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')-> accessToken;
return response()->json(['success' => $success], 200);
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
}
Para fazer esta chamada de API, precisamos registrar uma rota para ela.
routes / api.php
Route::post('login', 'ApiController@login');
O usuário pode fazer uma solicitação de postagem HTTP para esta API escrevendo o código abaixo:
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Esperamos que você entenda o uso do Laravel Passport para autenticação da API REST. Gostaríamos de ouvir sua opinião na seção de comentários abaixo. Também recomendamos ler o artigo Tutorial da API do Laravel: Como construir e testar uma API RESTful, que achamos útil para os leitores.