Json Web Token in Flow
Begrifflichkeiten
JWT: Ein signiertes und gegebenenfalls verschlüsseltes JsonWebToken
Client: Beispielsweise eine ReactApp, die mit einer API kommuniziert, oder einfach eine Webseite die per Javascript eine API anspricht.
Server: Hier werden die Tokens erstellt und ausgeliefert - eine API, die die Tokens verwendet muss nicht auf diesem Server liegen.
API: Ein Dienst auf einem Server, mit dem sich ein Client mittels eines Tokens authentifiziert.
Flow: Verwendetes PHP Framwork, das unter vielen anderen Dingen ein robustes und erweiterbares Authentifzierungsframework enthält.
Kurzbeschreibung Json Web Token
Meist für APIs genutzt, kann ein Client (oder der Benutzer eines Clients) sich an einem Authentifizierungsendpunkt ein Token abholen, das seine Informationen (Rechte, Rollen, etc.) beinhaltet. Dieses Token ist signiert, bei sensiblem Inhalt verschlüsselt und für einen begrenzten Zeitraum (oft eine Stunde) gültig. Eine API kann nun einen Authentifizierungsmechanismus bereitstellen, bei dem nur das Token mitgeschickt werden muss. Auf API Seite sind alle nötigen Informationen und Sicherheitsmaßnahmen im Token enthalten. So muss die API kein Session Handling oder Ähnliches implementieren.
Implementierung in Flow
Flow benötigt für eine eigene Authentifizierungsmethode zwei Dinge: einen Provider, der die Authentifizierung durchführt, und ein Token das eine Schnittstelle zum Prüfen des JWT bereitstellt.
Konfiguration
Weiterführende Links
Der grobe Aufbau des implementierten Providers so:
<?php
class JsonWebTokenProvider extends AbstractProvider {
/**
* @var \TYPO3\Flow\Http\RequestHandler
* @Flow\Inject
*/
protected $requestHandler;
/**
* @return array
*/
public function getTokenClassNames() {
return [JsonWebToken::class];
}
/**
* @param TokenInterface $authenticationToken
* @throws UnsupportedAuthenticationTokenException
* @return void
*/
public function authenticate(TokenInterface $authenticationToken) {
if (!($authenticationToken instanceof JsonWebToken)) {
throw new UnsupportedAuthenticationTokenException('This provider cannot authenticate the given token.', 1486136719);
}
/**
* Prüft das eingehende Token und setzt den Status entsprechend.
* Hier wird die checkJwt() des Tokens genutzt.
* Der neue Status kann dann einer der folgenden sein: AUTHENTICATION_SUCCESSFUL, WRONG_CREDENTIALS
* oder NO_CREDENTIALS_GIVEN.
*/
}
}
Der grobe Aufbau des implementierten Tokens sieht so aus:
<?php
class JsonWebToken extends AbstractToken implements SessionlessTokenInterface {
/**
* Für leichtes Anpassen laden wir JWT spezifische statische Daten aus den Settings, wie zum Beispiel den Key zum Signieren der JWTs.
* @Flow\InjectConfiguration(path="authentication.jwtSecret")
* @var string
*/
protected $secret;
/**
* @param ActionRequest $actionRequest
* @return void
*/
public function updateCredentials(ActionRequest $actionRequest) {
/**
* Entnimmt dem Request das JWT (beispielsweise POST, oder Cookie und setzt entsprechend den Status des Tokens auf NO_CREDENTIALS_GIVEN oder AUTHENTICATION_NEEDED.
*/
}
/**
* @param string $encodedJwt
* @return bool
*/
public function checkJwt($encodedJwt = '') {
/**
* Nimmt das JWT entgegen und prüft den Inhalt mit einer entsprechenden Json Web Token Bibliothek. Weiter unten dazu ein paar Links.
*/
}
}
Settings.yaml
TYPO3:
Flow:
security:
authentication:
providers:
'JsonWebTokenProvider':
provider: 'Namespace\JsonWebTokenProvider'
token: 'Namespace\JsonWebToken'
Hat dir der Artikel gefallen?
Werkraum News:

Toller Podcast zu Künstliche Intelligenz von Sascha Lobo
Wir von werkraum träumen ja schon seit langem vom eigenen Podcast, wäre das nicht immer so viel spannende Projekte, die es zu erledigen gibt. Solange hören wir einfach andere…
Matomo im DDEV installieren
Ich zeige euch wie man eine lokale Matomo Instanz im DDEV nutzen kann.
Strukturierte Daten - schema.org
Suchmaschinen mit den richtigen Daten füttern ist einfacher als man denkt.