Uwierzytelnianie aplikacji mobilnej za pomocą tokena w Laravel
Czy używasz Laravela jako back-endu swojej aplikacji mobilnej? Jeśli tak, to prawdopodobnie szukasz prostego rozwiązania do uwierzytelniania aplikacji mobilnej. Wielu użytkowników może korzystać z Twojej aplikacji mobilnej i chcesz przeprowadzić uwierzytelnianie, aby udostępniać treści użytkownikom mobilnym. W tym artykule dowiemy się, jak przeprowadzić uwierzytelnianie oparte na tokenach w Laravel. Możesz również użyć tego samego podejścia do uwierzytelniania REST API.
Zamierzamy zintegrować Laravel Sanctum, który jest lekkim systemem uwierzytelniania. Możesz uznać to za zamiennik uwierzytelniania opartego na OAuth.
Podczas korzystania z Sanctum tokeny API użytkownika są przechowywane w bazie danych. Ten token musi zostać wysłany jako Bearer
token poprzez Authorization
nagłówek z aplikacji mobilnej do punktów końcowych Laravel API. Te tokeny mają zazwyczaj bardzo długi czas ważności (lata).
Biorąc to pod uwagę, przyjrzyjmy się, jak używać Sanctum do uwierzytelniania aplikacji mobilnych.
Zainstaluj i skonfiguruj Laravel Sanctum
Aby rozpocząć, musisz najpierw zainstalować pakiet Sanctum w swojej aplikacji Laravel. Zainstaluj go za pomocą polecenia:
composer require laravel/sanctum
Następnie opublikuj pliki konfiguracyjne i migracyjne Sanctum, uruchamiając poniższe polecenie.
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Następnie uruchom komendę migracji, która utworzy personal_access_tokens
tabelę w Twojej bazie danych. To jest tabela, w której będą przechowywane wszystkie tokeny API.
php artisan migrate
Domyślnie każde żądanie w Laravel wymaga tokena csrf. W przypadku braku tego tokena csrf, Laravel nie kontynuuje Twojego żądania. Jeśli chodzi o generowanie tokenów API za pomocą Sanctum, musimy pominąć wysyłanie tokena csrf. W tym celu dodaj sanctum/token
trasę do $except
zmiennej app/Http/Middleware/VerifyCsrfToken.php
. Tę sanctum/token
trasę utworzę w kolejnych krokach.
<?php
...
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'sanctum/token'
];
}
W celu uwierzytelnienia musimy wydać użytkownikom token. Musisz więc użyć HasApiTokens
cechy do modelu użytkownika w następujący sposób.
<?php
namespace AppModels;
...
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
...
}
Wydawanie tokenów API do uwierzytelniania
Aby w każdym żądaniu wysłać token Bearer z nagłówkiem Authorization, należy najpierw wystawić token API. Zamierzam stworzyć metodę, która generuje token API dla każdego użytkownika. Do wystawienia tokena wymagane będzie przesłanie adresu e-mail, hasła oraz urządzenia użytkownika.
Dodaj poniższą trasę w routes/web.php
Route::post('/sanctum/token', 'APITokenController@create_token');
Następnie utwórz kontroler APITokenController
za pomocą polecenia:
php artisan make:controller APITokenController
Zdefiniuj create_token()
metodę w nowo utworzonym kontrolerze w następujący sposób.
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesHash;
use IlluminateValidationValidationException;
class APITokenController extends Controller
{
public function create_token(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->input('email'))->first();
if (! $user ||! Hash::check($request->input('password'), $user->password)) {
return [
'error' => 'The provided credentials are incorrect.'
];
}
return $user->createToken($request->input('device_name'))->plainTextToken;
}
}
Powyższy kod najpierw sprawdza poświadczenia użytkownika. Jeśli poświadczenia są poprawne, to w odpowiedzi wysyła token w formacie zwykłego tekstu. Tutaj otrzymuję wartości wejściowe, biorąc pod uwagę, że zostaną wysłane w obiekcie JSON.
Spróbuj wysłać żądanie POST z poświadczeniami użytkownika, a powinieneś otrzymać token w postaci zwykłego tekstu. Ten token API może być przechowywany na urządzeniu mobilnym i używany w nagłówku podczas wysyłania żądań API.
W moim przypadku używam rozszerzenia kodu VS Rest Client, a moja prośba sanctum/token
jest taka, jak pokazano na zrzucie ekranu poniżej.
Udaj się do bazy danych i powinieneś zobaczyć, że twój token jest przechowywany w personal_access_tokens
tabeli.
Sanctum utworzy wiele tokenów za każdym razem, gdy trafisz na sanctum/token
trasę z poprawnymi danymi uwierzytelniającymi. Jeśli chcesz odwołać poprzedni token, dodaj poniższą instrukcję przed ostatnią instrukcją powrotu powyższego kodu.
// Revoke previous tokens...
$user->tokens()->delete();
return $user->createToken($request->input('device_name'))->plainTextToken;
Na koniec chroń trasy, dodając auth:sanctum
oprogramowanie pośredniczące w następujący sposób.
Route::middleware('auth:sanctum')->get('/products', function() {
// write a code
});
Oprogramowanie pośredniczące sprawdza, czy token został odebrany w nagłówku autoryzacji. Jeśli token API jest poprawny, to tylko on umożliwia przejście do trasy.
Na przykład w kodzie VS możesz wysłać token API jako token Bearer z nagłówkiem Authorization, jak pokazano poniżej.
Mam nadzieję, że rozumiesz, jak zintegrować uwierzytelnianie aplikacji mobilnych za pomocą tokena w Laravelu. Chciałbym usłyszeć wasze przemyślenia i sugestie w sekcji komentarzy poniżej.
Powiązane artykuły
- Jak stworzyć bloga z Laravel
- Przewodnik po dodaniu Google reCAPTCHA v3 do Twojej witryny Laravel
- Jak przesłać wideo na YouTube w aplikacji Laravel