Verständnis von Simple OAuth in Drupal: Authentifizierung für entkoppelte Anwendungen
Was ist Simple OAuth?
Simple OAuth ist ein Drupal-Modul, das Authentifizierungsfunktionen für entkoppelte Anwendungen bietet. Es implementiert eine tokenbasierte Authentifizierung, die es Benutzern ermöglicht, sicher auf Ihre Anwendung zuzugreifen, indem sie Zugriffstoken anstelle von traditionellen Anmeldeinformationen verwenden.
Ablauf der Token-basierten Authentifizierung
Der Authentifizierungsprozess folgt einem hierarchischen Tokensystem:
- Zugriffstoken: Die primäre Authentifizierungsberechtigung, generiert als eindeutiger SHA-256-Hash
- Aktualisierungstoken: Wird verwendet, um neue Zugriffstoken zu generieren, wenn sie ablaufen
- Grundlegende Authentifizierung: Erforderlich, wenn sowohl Zugriffs- als auch Aktualisierungstoken ablaufen
Verständnis von Zugriffstoken
Zugriffstoken sind JWT (JSON Web Tokens), die zwei Schlüsselkomponenten enthalten:
Ansprüche
Ansprüche speichern wesentliche Benutzeridentitätsinformationen, die von der Client-Anwendung benötigt werden. Standardmäßig enthält Simple OAuth zwei Ansprüche:
- `mail`: E-Mail-Adresse des Benutzers
- `username`: Kontoname des Benutzers
Bereiche
Bereiche repräsentieren Benutzerrollen innerhalb Ihrer Anwendung. Sie bestimmen, welche Aktionen ein Benutzer ausführen kann. Einige wichtige Punkte zu Bereichen:
- Mehrere Rollen sollten mit Leerzeichen getrennt angegeben werden
- Wenn kein Bereich definiert ist, wird die Rolle 'authentifiziert' zum Standard
- Das endgültige Token enthält sowohl angeforderte Bereiche als auch zusätzliche Rollen, die in der Client-ID definiert sind
Erweiterung der Ansprüche von Zugriffstoken
Um benutzerdefinierte Ansprüche über die Standardansprüche `mail` und `username` hinaus hinzuzufügen, müssen Sie die Klasse `AccessTokenEntity` erweitern. So geht's:
class MyAccessTokenEntity extends AccessTokenEntity {
public function convertToJWT(CryptKey $privateKey) {
$private_claims = [];
\Drupal::moduleHandler()
->alter('simple_oauth_private_claims', $private_claims, $this);
if (!is_array($private_claims)) {
$message = 'Eine Implementierung von hook_simple_oauth_private_claims_alter '
. 'gibt einen ungültigen $private_claims-Wert zurück. $private_claims '
. 'muss ein Array sein.';
throw new \InvalidArgumentException($message);
}
$builder = (new Builder())
->setAudience($this->getClient()->getIdentifier())
->setId($this->getIdentifier(), TRUE)
->setIssuedAt(time())
->setNotBefore(time())
->setExpiration($this->getExpiryDateTime()->getTimestamp())
->setSubject($this->getUserIdentifier())
->set('scopes', $this->getScopes());
// Fügen Sie hier benutzerdefinierte Ansprüche hinzu
// Beispiel: $builder->set('user_picture', ...);
foreach ($private_claims as $claim_name => $value) {
$builder->set($claim_name, $value);
}
$key = new Key($privateKey->getKeyPath(), $privateKey->getPassPhrase());
$token = $builder->sign(new Sha256(), $key)->getToken();
return $token;
}
}
Implementierung der benutzerdefinierten Token-Entität
Um Ihre benutzerdefinierte Token-Entität zu verwenden, müssen Sie sie im Service-Container von Drupal registrieren:
class MyServiceProvider extends ServiceProviderBase implements ServiceProviderInterface {
public function alter(ContainerBuilder $container) {
$definition = $container->getDefinition('simple_oauth.repositories.access_token');
$definition->setClass('Drupal\my_module\Repositories\MyAccessTokenRepository');
}
}
Best Practices
- Überprüfen Sie immer private Ansprüche, bevor Sie sie verarbeiten
- Betrachten Sie die Ablaufzeiten der Token sorgfältig für Ihren Anwendungsfall
- Implementieren Sie eine ordnungsgemäße Fehlerbehandlung für die Generierung und Validierung von Token
- Dokumentieren Sie alle benutzerdefinierten Ansprüche, die zum System hinzugefügt wurden
- Überwachen Sie die Token-Nutzung und implementieren Sie bei Bedarf eine Ratenbegrenzung
Kontaktieren Sie uns, wenn Sie Hilfe benötigen.
