Skip to content

Authentifizierung ​

Alle Aufrufe brauchen einen Token. Ihn stellt der Authentifizierungsserver aus.

Ablauf ​

mermaid
sequenceDiagram
    participant C as Client
    participant A as Auth Server
    C->>A: GET /GetPublicKey/
    A-->>C: PublicKey (Base64)
    Note over C: username + password in UTF-16LE konvertieren
    Note over C: Mit PublicKey verschlüsseln + Base64 kodieren
    C->>A: POST /GetSessionToken/ (JSON)
    A-->>C: Session Token
    Note over C: Token für alle weiteren Requests verwenden

1. PublicKey abrufen ​

GET https://portal.3doffice.de/authsrv/AuthSrv.dll/datasnap/rest/AuthSrv/GetPublicKey/

Die Antwort enthält den öffentlichen Schlüssel im result[0]-Feld.

2. Credentials vorbereiten ​

  • username und password in UTF-16 Little Endian ohne BOM umwandeln
  • Beide mit dem PublicKey über OpenSSL verschlüsseln
  • Ergebnis Base64-kodieren

3. JSON erstellen und senden ​

json
{
  "User": "BASE64_VERSCHLUESSELTER_USERNAME",
  "Password": "BASE64_VERSCHLUESSELTES_PASSWORT",
  "PublicKey": "PUBLIC_KEY_AUS_SCHRITT_1",
  "RememberMe": true
}

Parameter:

FeldBeschreibung
UserOpenSSL-verschlüsselter und Base64-kodierter Benutzername
PasswordOpenSSL-verschlüsseltes und Base64-kodiertes Passwort
PublicKeyAus Schritt 1
RememberMefalse = Token 12h gültig; true = Token 90 Tage gültig
POST https://portal.3doffice.de/authsrv/AuthSrv.dll/datasnap/rest/AuthSrv/%22GetSessionToken%22/

Token im WebKatalog ​

Der Token wird als URL-Parameter token übergeben:

{BASE}/planning?token={TOKEN}
  • Der WebKatalog merkt sich den Token: im iFrame im sessionStorage, sonst in einem Cookie. Folgeaufrufe ohne token verwenden ihn weiter.
  • Ein neuer Token setzt Hersteller und Katalogposition der vorherigen Sitzung zurück.
  • Ohne Token öffnet der WebKatalog die Login-Seite, im iFrame in einem neuen Tab. Ein abgelaufener oder ungültiger Token wird verworfen; dann erscheint die Login-Seite im selben Fenster bzw. iFrame.

Für REST-Aufrufe wird der Token ebenfalls als Parameter token angehängt.

Abmelden ​

GET https://portal.3doffice.de/authsrv/AuthSrv.dll/datasnap/rest/AuthSrv/logout/{TOKEN}

PHP-Beispiel ​

php
<?php
function encryptData($dataToEncrypt, $pubKey) {
  $sealed = "";
  $dataToEncrypt = iconv("UTF-8", "UCS-2LE", $dataToEncrypt);
  openssl_public_encrypt($dataToEncrypt, $sealed, $pubKey);
  return base64_encode($sealed);
}

function getToken($username, $pw, $rememberme) {
  $json   = file_get_contents('https://portal.3doffice.de/authsrv/AuthSrv.dll/datasnap/rest/AuthSrv/GetPublicKey/');
  $obj    = json_decode($json);
  $pubKey = $obj->result[0];

  $json_post_data = json_encode(array(
    'User' => encryptData($username, $pubKey),
    'Password' => encryptData($pw, $pubKey),
    'PublicKey' => $pubKey,
    'RememberMe' => $rememberme
  ));

  $options = array(
    'http' => array(
      'method'  => 'POST',
      'content' => $json_post_data,
      'header'  => "Content-Type: application/json\r\n" .
                   "Accept: application/json\r\n"
    )
  );

  $context = stream_context_create($options);
  $result = file_get_contents(
    'https://portal.3doffice.de/authsrv/AuthSrv.dll/datasnap/rest/AuthSrv/%22GetSessionToken%22/',
    false,
    $context
  );

  $response = json_decode($result);
  return $response->result[0];
}

// Verwendung:
$username   = $_POST["username"];
$pw         = $_POST["password"];
$rememberme = ($_POST["rememberme"] == "true");

echo(getToken($username, $pw, $rememberme));
?>

HTTP POST zur Beispielimplementierung ​

Die Beispielimplementierung (gettoken.php) erwartet einen POST mit:

FeldBeschreibung
usernameBenutzername
passwordPasswort
remembermefalse = 12h, true = 90 Tage

Der zurückgegebene TOKEN wird dann für alle weiteren Aufrufe verwendet.

3D office WebKatalog 2.5 — ub.unitel GmbH