Jak używać Laravel Passport do uwierzytelniania REST API?
W dzisiejszym tworzeniu stron internetowych bardzo popularne są interfejsy API lub usługi sieciowe. Podczas tworzenia aplikacji mobilnej API pełni rolę pomostu do przekazywania danych między aplikacją mobilną a siecią. Zapewnienie bezpieczeństwa i uwierzytelniania wywołań API jest ważne dla ochrony danych przesyłanych między aplikacją a aplikacją.
W tym artykule zapoznamy się z Laravel Passport, który pozwala nam uwierzytelniać API. Passport jest budowany na górze serwera OAuth2, który jest znacznie bezpieczniejszy w sposobie budowania.
W przypadku interfejsów API wysyłaliśmy token dostępu, aby zweryfikować, czy przychodzące żądanie jest prawidłowe. Jeśli jest autoryzowany, to tylko on powinien umożliwiać interakcję z aplikacją. Paszport Laravel zapewnia wygodny sposób tworzenia i weryfikacji tokena względem wywołania API.
Instalacja
Na początek zakładamy, że zainstalowałeś Laravel w swoim systemie. Aby zainstalować Paszport, uruchom poniższe polecenie w terminalu.
composer require laravel/passport
Powyższe polecenie działałoby z najnowszą wersją Laravela. Jeśli używasz starszej wersji, polecenie będzie się nieco różnić w zależności od wersji Laravela. Na przykład, jeśli masz zainstalowany Laravel 5.5, twoje polecenie powinno wyglądać tak:
composer require laravel/passport=~4.0
To polecenie tworzy własny katalog migracji bazy danych. Te migracje spowodują utworzenie tabel przechowujących klientów i tokeny dostępu.
W swoim config/app.php
pliku zarejestruj dostawcę usług paszportowych w tablicy providerów.
config/app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Uruchommy migrację, która utworzy tabele bazy danych dla Paszportu.
php artisan migrate
Teraz, jeśli przejdziesz do swojego klienta bazy danych, zauważysz nowe tabele utworzone w Twojej bazie danych.
Następnie uruchom poniższe polecenie, które tworzy klucze szyfrowania w celu wygenerowania bezpiecznych tokenów dostępu. Poniższe polecenie tworzy klientów „dostęp osobisty" i „przyznawanie hasła”, które są zapisywane w tabeli oauth_clients
.
php artisan passport:install
Użytkownik może skopiować te tokeny do dalszych kroków. Właściwie zobaczymy 2 sposoby tworzenia tokenów dostępu. Jeden polega na tym, że klienci „przyznają hasło”, a drugi na uwierzytelnianiu logowania.
Konfiguracja paszportu
Udaj się do katalogów Laravel i otwórz AppUser
plik modelu. W tym pliku musimy dodać LaravelPassportHasApiTokens
cechę.
aplikacja/Użytkownik.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Następnie musimy wywołać Passport::routes
metodę w boot
metodzie 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();
}
}
Na koniec w config/auth.php
pliku ustaw opcję „sterownik” strażnika uwierzytelniania „api” na „paszport” w następujący sposób:
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Stwórz REST API i chroń go za pomocą Laravel Passport
Laravel tworzy plik, w routes/api.php
którym powinniśmy zadeklarować nasz punkt końcowy REST API. Możemy chronić nasze API, dodając auth:api
do niego oprogramowanie pośredniczące .
trasy/api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
W przypadku wielu punktów końcowych nie musimy za każdym razem dodawać oprogramowania pośredniczącego. Zamiast tego możemy to zrobić w następujący sposób:
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Ponieważ nasze „produkty” punktu końcowego są chronione, jeśli wywołamy je bezpośrednio bez tokena autoryzacji, otrzymamy odpowiedź „Nieuwierzytelniony”.
Oznacza to, że podczas wywoływania API należy w każdym żądaniu przekazać token autoryzacji. Tak więc Passport zweryfikuje token i zwróci odpowiedź.
Wygeneruj token dostępu dla API
Istnieje kilka sposobów na utworzenie tokena dostępu dla aplikacji. Zobaczymy 2 z nich w tym samouczku.
Pierwsza opcja
W pierwszej kolejności musisz wywołać /oauth/token z wymaganymi parametrami, a otrzymasz token w odpowiedzi.
Zakładamy, że do tworzenia żądań API używasz biblioteki Guzzle HTTP. Załóżmy, że masz inny projekt, z którego wysyłasz żądanie 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);
Powyższy kod zwraca tablicę zawierającą klucz ‘access_token’. Parametry client_id i client_secret otrzymaliśmy po uruchomieniu passport:install
. Możesz również uzyskać te szczegóły z tabeli bazy danych „oauth_clients”.
Spróbuj ponownie od listonosza, przekazując access_token do punktu końcowego ‘products’ i powinniśmy otrzymać odpowiedź.
W rzeczywistości musisz wywołać to API jak poniżej:
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Druga opcja
W pierwszej opcji powinieneś znać client_id i client_secret, aby wygenerować swój token. W niektórych sytuacjach może to nie być wygodny sposób. Passport zapewnia inną opcję generowania tokena dostępu wyłącznie za pomocą danych logowania.
W naszym ApiController.php
dodajmy metodę logowania z żądaniem postu i wpisujemy w nią poniższy kod.
<?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);
}
}
Aby wykonać to wywołanie API, musimy zarejestrować dla niego trasę.
trasy/api.php
Route::post('login', 'ApiController@login');
Użytkownik może wysłać żądanie HTTP post do tego interfejsu API, pisząc poniższy kod:
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Mamy nadzieję, że rozumiesz zastosowanie Laravel Passport do uwierzytelniania REST API. Chcielibyśmy poznać Twoje przemyślenia w sekcji komentarzy poniżej. Zalecamy również zapoznanie się z artykułem Laravel API Tutorial: Jak zbudować i przetestować RESTful API, który uznaliśmy za przydatny dla czytelników.