Hur man använder Laravel Passport för REST API-autentisering
I dagens webbutveckling är API: er eller webbtjänster mycket populära. Medan utvecklingen av en mobilapplikation spelar API en roll för att överföra data mellan mobilapplikation och webb. Att hålla API: er samtalsäkra och autentiserade är viktigt för att skydda data som överförs mellan applikation till applikation.
I den här artikeln studerar vi om Laravel Passport som gör det möjligt för oss att autentisera API: er. Pass är byggt på toppen av OAuth2-servern vilket är mycket säkrare på det sätt som det bygger.
När vi hanterade API: n skickade vi en åtkomsttoken för att verifiera om den inkommande begäran är giltig. Om det är auktoriserat bör endast det tillåta interaktion med applikationen. Laravel pass ger ett bekvämt sätt att skapa och verifiera token mot API-samtalet.
Installation
För att komma igång antar vi att du har installerat Laravel på ditt system. För att installera passet, kör kommandot nedan i terminalen.
composer require laravel/passport
Ovanför kommandot skulle fungera med den senaste versionen av Laravel. Om du kör äldre version kommer kommandot att vara något annorlunda beroende på din Laravel-version. Till exempel, om har Laravel 5.5 installerat bör ditt kommando vara:
composer require laravel/passport=~4.0
Detta kommando skapar en egen databasmigreringskatalog. Dessa migreringar skapar tabeller som lagrar klienterna och åtkomsttoken.
config/app.php
Registrera Passport-tjänsteleverantören i din fil i leverantörsarrangemanget.
config / app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Låt oss köra migreringen som skapar databastabellerna för Passport.
php artisan migrate
Nu, om du går till din databasklient, kommer du att märka de nya tabellerna som skapats i din databas.
Kör sedan kommandot nedan som skapar krypteringsnycklar för att generera säker åtkomsttoken. Kommandot nedan skapar “personlig åtkomst" och “lösenordstilldelning” -klienter som lagras i tabellen oauth_clients
.
php artisan passport:install
Användaren kan kopiera dessa tokens för nästa steg. Egentligen kommer vi att se två sätt att skapa åtkomsttoken. Det ena är genom detta "lösenord bevilja" klienter och en annan är på inloggningsautentisering.
Passkonfiguration
Gå till Laravel-katalogerna och öppna AppUser
modellfilen. I den här filen måste vi lägga till LaravelPassportHasApiTokens
egenskaper.
app / User.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Efter detta måste vi anropa Passport::routes
metoden i boot
metoden för 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();
}
}
Äntligen, i config/auth.php
filen ställer du in ‘drivrutinsalternativet för’ api ‘autentiseringsvakt till’ pass ‘enligt följande:
config / auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Skapa REST API och skydda det med Laravel Passport
Laravel skapar en fil routes/api.php
där vi ska deklarera våra REST API: er slutpunkt. Vi kan skydda vårt API genom att lägga till middleware auth:api
till det.
rutter / api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
För flera slutpunkter behöver vi inte lägga till mellanprogram varje gång. Istället kan vi göra det enligt följande:
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Eftersom våra slutpunkter "produkter" är skyddade om vi kallar det direkt utan auktoriseringstoken får vi ett "obehörigt" svar.
Det betyder att när du ringer till API är det viktigt att skicka auktoriseringstoken i varje begäran. Så, Passport kommer att verifiera token och returnera svaret.
Skapa åtkomsttoken för API
Det finns flera sätt att skapa en åtkomsttoken för applikationen. Vi kommer att se 2 av dem för denna handledning.
Första alternativet
På ett första sätt måste du ringa till / oauth / token med nödvändiga parametrar och du får token som svar.
Vi antar att du använder ett Guzzle HTTP-bibliotek för att göra API-begäran. Låt oss säga att du har ett annat projekt från vilket du gör API-begäran.
<?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);
Ovan kod returnerar en matris som innehåller nyckeln ‘access_token’. Parametrarna client_id och client_secret vi fick när vi kör passport:install
. Du kan också få dessa uppgifter från din databastabell ‘oauth_clients’.
Försök igen från brevbäraren genom att skicka access_token till slutproduktens ” slutpunkt ” så ska vi få svaret.
I själva verket måste du ringa detta API som nedan:
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Andra alternativet
I det första alternativet bör du känna till client_id och client_secret för att generera din token. Detta kan inte vara ett bekvämt sätt i vissa scenarier. Passport ger ett annat alternativ att generera åtkomsttoken endast genom inloggningsuppgifter.
I vår ApiController.php
lägga till inloggningsmetod med post begäran och skriva under koden i den.
<?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);
}
}
För att göra detta API-samtal måste vi registrera en rutt för det.
rutter / api.php
Route::post('login', 'ApiController@login');
Användaren kan göra en HTTP-postförfrågan till detta API genom att skriva koden nedan:
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Vi hoppas att du förstår användningen av Laravel Passport för REST API-autentisering. Vi vill höra dina tankar i kommentarfältet nedan. Vi rekommenderar också att du går igenom artikeln Laravel API Tutorial: Hur man bygger och testar ett RESTful API som vi tyckte var användbart för läsare.