Laravel package for Logto authentication and authorization
tivents/logto-laravel-sdk is a Laravel package for laravel package for logto authentication and authorization.
It currently has 0 GitHub stars and 3 downloads on Packagist (latest version 0.0.19).
Install it with composer require tivents/logto-laravel-sdk.
Discover more Laravel packages by tivents
or browse all Laravel packages to compare alternatives.
Last updated
Ein Laravel-Package zur Integration von Logto Authentication. Unterstützt OIDC (OpenID Connect) und OAuth 2.0 Flows.
auth:logtologto/sdk für maximale Kompatibilitätcomposer require tivents/logto-laravel-sdk
In config/app.php den Service Provider hinzufügen (ab Laravel 10 wird das automatisch gemacht):
'providers' => [
// ... andere Provider
TIVENTS\LogtoLaravelSdk\LogtoServiceProvider::class,
],
'aliases' => [
// ... andere Aliases
'Logto' => TIVENTS\LogtoLaravelSdk\Facades\Logto::class,
],
php artisan vendor:publish --tag=logto-config
Das Package nutzt automatisch das offizielle logto/sdk für alle Authentifizierungs-Flows.
Die Integration ist bereits aktiviert und erfordert keine zusätzliche Konfiguration.
Falls du das SDK explizit deaktivieren möchtest, kannst du den SDK Adapter in der Service Provider Registrierung entfernen.
php artisan vendor:publish --tag=logto-migrations
php artisan migrate
Füge folgende Variablen zu deiner .env-Datei hinzu:
# Logto Configuration
LOGTO_APP_ID=your-app-id
LOGTO_APP_SECRET=your-app-secret
LOGTO_ENDPOINT=https://your-instance.logto.app
# OIDC Configuration
LOGTO_OIDC_ENABLED=true
LOGTO_OIDC_REDIRECT_URI=/auth/logto/callback
LOGTO_OIDC_POST_LOGOUT_REDIRECT_URI=/
LOGTO_OIDC_SCOPES=openid profile email
LOGTO_OIDC_PKCE=true
# User Configuration
LOGTO_USER_MODEL=App\Models\User
LOGTO_AUTO_CREATE_USERS=true
LOGTO_AUTO_UPDATE_USERS=true
LOGTO_DEFAULT_ROLE=user
# Token Configuration
LOGTO_ACCESS_TOKEN_LIFETIME=3600
LOGTO_REFRESH_TOKEN_LIFETIME=86400
LOGTO_STORE_ENCRYPTED=true
# Guard Configuration
LOGTO_GUARD_NAME=logto
LOGTO_GUARD_DRIVER=session
LOGTO_GUARD_PROVIDER=users
http://localhost/auth/callback (für Entwicklung)https://deine-domain.de/auth/callback (für Produktion)http://localhost/ (für Entwicklung)https://deine-domain.de/ (für Produktion).env-Datei<!-- Einfacher Login-Link -->
<a href="@logto">Login mit Logto</a>
<!-- Oder manuell -->
<a href="{{ route('logto.login') }}">Login mit Logto</a>
#### Direkte SDK Methoden nutzen
Das Package stellt auch direkte Zugriffsmethoden auf das offizielle Logto SDK bereit:
```php
use TIVENTS\LogtoLaravelSdk\Facades\Logto;
// Login-URL mit dem offiziellen SDK generieren
$loginUrl = Logto::getSdkSignInUrl('https://deine-domain.de/auth/logto/callback');
// UserInfo mit dem offiziellen SDK abrufen
$userInfo = Logto::getSdkUserInfo();
// SDK-Session bereinigen
Logto::clearSdkSession();
// Prüfen ob der Benutzer über das SDK authentifiziert ist
$isAuthenticated = Logto::isSdkAuthenticated();
// SDK Access Token abrufen
$accessToken = Logto::getSdkAccessToken();
// SDK ID Token abrufen
$idToken = Logto::getSdkIdToken();
Vorteile der SDK-Methoden:
#### Schutz von Routen
```php
// In web.php
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth:logto']);
// Oder mit Gruppe
Route::middleware(['auth:logto'])->group(function () {
Route::get('/profile', [ProfileController::class, 'index']);
Route::get('/settings', [SettingsController::class, 'index']);
});
use TIVENTS\LogtoLaravelSdk\Facades\Logto;
// Autorisierungs-URL generieren
$authUrl = Logto::getAuthorizationUrl();
// Nach dem Callback: Code gegen Tokens tauschen
$tokens = Logto::exchangeCodeForTokens($code);
// Benutzerinformationen abrufen
$userInfo = Logto::getUserInfo($tokens['access_token']);
use Illuminate\Support\Facades\Auth;
// Prüfen ob Benutzer authentifiziert ist
if (Auth::guard('logto')->check()) {
// Benutzer ist authentifiziert
$user = Auth::guard('logto')->user();
}
// Benutzer abmelden
Auth::guard('logto')->logout();
// Access Token abrufen
$accessToken = Auth::guard('logto')->getAccessToken();
// Token refreshen
$newTokens = Auth::guard('logto')->refreshToken();
// Benutzerinformationen abrufen
$userInfo = Auth::guard('logto')->getUserInfo();
use TIVENTS\LogtoLaravelSdk\Facades\Logto;
// Authentifizierte API-Anfrage
$response = Logto::request('GET', '/api/user', [], $userId);
// Oder mit spezifischen Optionen
$response = Logto::request('POST', '/api/data', [
'json' => ['key' => 'value'],
], $userId);
use TIVENTS\LogtoLaravelSdk\Facades\Logto;
// Token für M2M abrufen
$tokens = Logto::clientCredentialsFlow(['api:read', 'api:write']);
// Mit Token API-Anfragen stellen
$response = Logto::request('GET', '/api/protected', [
'headers' => [
'Authorization' => 'Bearer ' . $tokens['access_token'],
],
]);
<!-- Authentifizierungs-URL -->
@logto
<!-- Aktueller Benutzer -->
@logtoUser
<!-- Logout-URL -->
@logtoLogout
// Route mit E-Mail-Verifizierung schützen
Route::get('/profile', function () {
return view('profile');
})->middleware(['auth:logto', 'verified.logto']);
In der config/logto.php kannst du das Mapping zwischen Logto-Claims und Laravel-Benutzerattributen konfigurieren:
'user' => [
'mapping' => [
'id' => 'sub', // Logto 'sub' → Laravel 'id'
'name' => 'name', // Logto 'name' → Laravel 'name'
'email' => 'email', // Logto 'email' → Laravel 'email'
'email_verified' => 'email_verified',
'picture' => 'picture', // Logto 'picture' → Laravel 'avatar'
'phone' => 'phone',
'phone_verified' => 'phone_verified',
],
],
In der config/logto.php kannst du die OIDC-Scopes konfigurieren:
'oidc' => [
'scopes' => explode(' ', env('LOGTO_OIDC_SCOPES', 'openid profile email')),
],
'tokens' => [
'access_token_lifetime' => env('LOGTO_ACCESS_TOKEN_LIFETIME', 3600),
'refresh_token_lifetime' => env('LOGTO_REFRESH_TOKEN_LIFETIME', 86400),
'store_encrypted' => env('LOGTO_STORE_ENCRYPTED', true),
],
APP_SESSION_DRIVER korrekt konfiguriert istsub-Claim in der UserInfo-Response enthalten istopenid) angefordert werdenLOGTO_ENDPOINT korrekt istLOGTO_LOGGING_ENABLED=true
LOGTO_LOGGING_LEVEL=debug
Logto::getAuthorizationUrl(?string $state, ?string $nonce, ?string $redirectUri)
Logto::exchangeCodeForTokens(string $code)
Logto::refreshToken(string $refreshToken)
Logto::getUserInfo(string $accessToken)
Logto::validateIdToken(string $idToken, ?string $nonce)
Logto::logout(?string $idToken, ?string $postLogoutRedirectUri)
Logto::getAccessToken(string $userId)
Logto::request(string $method, string $path, array $options, ?string $userId)
// Authentifizierung
Logto::getSdkSignInUrl(string $redirectUri, array $extraParams = [])
Logto::handleSdkCallback(string $redirectUri)
Logto::getSdkSignOutUrl(?string $postLogoutRedirectUri, ?string $idTokenHint)
// Token Management
Logto::getSdkAccessToken(?string $resource = null)
Logto::getSdkIdToken()
Logto::getSdkRefreshToken()
Logto::refreshSdkAccessToken()
// Session Management
Logto::clearSdkSession()
Logto::isSdkAuthenticated()
// Storage (für erweiterte Nutzung)
Logto::getSdkAdapter()->get(StorageKey $key)
Logto::getSdkAdapter()->set(StorageKey $key, ?string $value)
Logto::getSdkAdapter()->delete(StorageKey $key)
Logto::getAccessToken(string $userId) Logto::request(string $method, string $path, array $options = [], ?string $userId = null) Logto::getUserByAccessToken(string $accessToken) Logto::clientCredentialsFlow(array $scopes = [])
### TokenManager
```php
$tokenManager = app('TIVENTS\LogtoLaravelSdk\Services\TokenManager');
$tokenManager->storeTokens(string $userId, array $tokens)
$tokenManager->getAccessToken(string $userId)
$tokenManager->getRefreshToken(string $userId)
$tokenManager->refreshAccessToken(string $userId, LogtoClient $client)
$tokenManager->clearTokens(string $userId)
$tokenManager->hasValidTokens(string $userId)
$tokenManager->getTokenExpiration(string $userId)
$tokenManager->getTokenType(string $userId)
# Alle Tests
composer test
# Nur Unit Tests
./vendor/bin/pest tests/Unit
# Nur Feature Tests
./vendor/bin/pest tests/Feature
# Nur SDK Adapter Tests
./vendor/bin/pest tests/Unit/LogtoSdkAdapterTest.php
composer dump-autoload
Das Package nutzt einen Adapter-Pattern um das offizielle logto/sdk mit Laravel zu integrieren:
┌─────────────────────────────────────────────┐
│ Laravel Application │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ LogtoServiceProvider │
│ - Registriert LogtoSdkAdapter │
│ - Registriert LogtoClient │
│ - Registriert AuthController │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ LogtoSdkAdapter │
│ - Implementiert Storage Interface │
│ - Erstellt LogtoConfig │
│ - Erstellt LogtoClient (SDK) │
│ - Übersetzt Laravel Session ↔ SDK Storage │
└─────────────────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ LogtoClient │ │ Logto SDK │
│ (Laravel Wrapper)│ │ (Offiziell) │
│ │ │ │
│ - getAuthorizationUrl()│ │ - signIn() │
│ - exchangeCodeForTokens()│ │ - handleSignInCallback()│
│ - Fallback Logik │ │ - fetchUserInfo()│
└─────────────────┘ └─────────────────┘
Alle Hauptmethoden des LogtoClient versuchen zuerst das offizielle SDK zu nutzen.
Falls das SDK nicht verfügbar ist oder ein Fehler auftritt, wird automatisch auf
die manuelle Implementierung zurückgegriffen. Das gewährleistet maximale Kompatibilität.
Beispiel:
public function getAuthorizationUrl(...)
{
// 1. Versuche SDK Adapter
if ($this->sdkAdapter) {
try {
return $this->sdkAdapter->getSignInUrl(...);
} catch (\Exception $e) {
Log::warning('SDK failed, falling back...');
}
}
// 2. Fallback auf manuelle Implementierung
return $this->getAuthorizationUrlLegacy(...);
}
Pull Requests sind willkommen. Bitte stelle sicher, dass:
Dieses Package ist unter der MIT-Lizenz lizenziert.
TIVENTS Logto Laravel SDK - Einfache Integration von Logto Authentication in Laravel-Anwendungen.