OBS/Kostenpflichtige Module/RESTServer/Beispiel1: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Kostenpflichtige Module}}
{{Kostenpflichtige Module}}


Bei diesem Beispiel werden Daten aus dem Steuerungs-Modul abgerufen und in einer Tabelle auf einer Webseite angezeigt.
=Beispiel 1: Daten-Abruf mit JWT-Authentifizierung=


=Endpunkt-Script=
In diesem Beispiel werden Steuerungs-Variablen aus OBS abgerufen und auf einer Webseite ausgegeben. Der Zugang ist mit JWT-Pflicht eingerichtet, der Konsument muss sich daher zuerst anmelden und einen Token bezogen haben.
<syntaxhighlight lang="pascal" line="1">
 
procedure _AddVar(oArr: TJSONArray; cVar: string);
==Einrichtung in OBS==
var oWert  : TJSONObject;
 
     cTitel  : string;
* '''Server-Profil:''' Standard-TLS-Profil ''Public-API'' mit Bindung 0.0.0.0:443
     cData  : string;
* '''Zugang:''' ''Web-Dashboard''
     cEinheit: string;
** API-Key: zufaellig generiert
     lString : Boolean;
** JWT aktiv, JWT-Endpunkt ''oauth'', JWT-Key zufaellig, JWT-Exp 60 (Minuten)
    lAlign  : Boolean;
** CORS-Origins: ''https://dashboard.kunde.de''
* '''Endpunkt:''' ''steuerung/v1'', dem Profil ''Public-API'' zugeordnet
* '''Berechtigung:''' Zugang ''Web-Dashboard'' fuer Endpunkt ''steuerung/v1'' freigeschaltet
 
==JWT-Authentifizierungs-Skript (Zugang)==
 
Wird ueber die Zugaenge-Liste mit '''F7''' geoeffnet. Pruefen, ob Benutzername/Passwort gegen die OBS-Benutzerverwaltung passen.
 
<syntaxhighlight lang="pascal" line>
function Authenticate(oParams: TStrings; oBody: TJSONObject): string;
var oRes  : TJSONObject;
     cUser : string;
     cPass : string;
     cSql  : string;
     qUser : TxFQuery;
begin
begin
     if (ST_Variable(oDB, cVar, cTitel, cData, cEinheit, lString, lAlign)) then begin
    oRes := TJSONObject.Create();
    try
        cUser := '';
        cPass := '';
        if (Assigned(oBody)) then begin
            oVal := oBody.GetValue('username');
            if (Assigned(oVal)) then begin
                cUser := oVal.Value;
            end;
            oVal := oBody.GetValue('password');
            if (Assigned(oVal)) then begin
                cPass := oVal.Value;
            end;
        end;
        cSql := 'SELECT u_nr, u_name FROM benutzer' +
                ' WHERE u_login = ' + DB_SQLVal(cUser) +
                ' AND u_passwort_hash = ' + DB_SQLVal(HashPasswort(cPass)) +
                ' AND u_aktiv = "1"';
        if (DB_SOpen('Y00CXXXXAA', oDB, cSql, qUser)) then begin
            oRes.AddPair('status'          , 1);
            oRes.AddPair('_OBS_JWT_ID'      , qUser.A2C('u_nr'));
            oRes.AddPair('_OBS_JWT_SUBJECT' , qUser.A2C('u_name'));
            oRes.AddPair('_OBS_JWT_AUDIENCE', 'dashboard');
        end else begin
            oRes.AddPair('status', 9);
            oRes.AddPair('error' , 'Login fehlgeschlagen');
        end;
        DB_Close(qUser);
 
        result := oRes.ToJSON();
    finally
        MyFreeAndNil(oRes);
    end;
end;
</syntaxhighlight>
 
==Endpunkt-Skript ''steuerung/v1''==
 
Liefert eine Liste von Steuerungs-Werten zurueck. Die Auswertung der JWT-Claims sorgt dafuer, dass nur Audience ''dashboard'' Daten erhaelt.
 
<syntaxhighlight lang="pascal" line>
procedure _AddVar(oArr: TJSONArray; const cVar: string);
var oWert  : TJSONObject;
    cTitel : string;
    cData  : string;
    cEinh  : string;
    lString: Boolean;
    lAlign : Boolean;
begin
     if (ST_Variable(oDB, cVar, cTitel, cData, cEinh, lString, lAlign)) then begin
         oWert := TJSONObject.Create();
         oWert := TJSONObject.Create();
       
         oWert.AddPair('variable', cVar);
         oWert.AddPair('Variable', cVar);
         oWert.AddPair('titel'  , cTitel);
         oWert.AddPair('Titel'  , cTitel);
         oWert.AddPair('wert'    , cData);
         oWert.AddPair('Wert'    , cData);
         oWert.AddPair('einheit' , cEinh);
         oWert.AddPair('Einheit' , cEinheit);
 
         oArr.Add(oWert);
         oArr.Add(oWert);
     end;
     end;
Zeile 27: Zeile 88:
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------


function Get(oParams: TStrings): string;
function Get(oParams: TStrings; oBody: TJSONObject): string;
var oArr: TJSONArray;
var oArr: TJSONArray;
begin
begin
     result := '';
     // Audience-Pruefung: nur Dashboard-Tokens akzeptieren
    if (oParams.Values['_OBS_JWT_AUDIENCE'] <> 'dashboard') then begin
        result := '{"error":"audience not allowed"}';
        exit;
    end;


     oArr := TJSONArray.Create();
     oArr := TJSONArray.Create();
    try
        _AddVar(oArr, 'WERT_1');
        _AddVar(oArr, 'WERT_2');
        _AddVar(oArr, 'WERT_3');
        _AddVar(oArr, 'WERT_4');
        result := oArr.ToJSON();
    finally
        MyFreeAndNil(oArr);
    end;
end;
</syntaxhighlight>
==JavaScript-Client (Browser)==
Im Browser werden zwei Aufrufe gemacht: erst Token holen, dann Daten lesen.
<syntaxhighlight lang="javascript" line>
const API_BASE = 'https://api.meinserver.de';
const API_KEY  = '[API-KEY]';
async function login(username, password) {
    const res = await fetch(`${API_BASE}/oauth/`, {
        method:  'POST',
        headers: { 'Content-Type': 'application/json', 'apikey': API_KEY },
        body:    JSON.stringify({ username, password })
    });
    if (!res.ok) throw new Error('Login fehlgeschlagen');
    const data = await res.json();
    return data.token;
}
async function ladeSteuerung(token) {
    const res = await fetch(`${API_BASE}/steuerung/v1`, {
        method:  'GET',
        headers: {
            'apikey':        API_KEY,
            'Authorization': 'Bearer ' + token
        }
    });
    if (!res.ok) throw new Error('Abruf fehlgeschlagen: ' + res.status);
    return res.json();
}
async function zeigeTabelle() {
    const token = await login('mitarbeiter', 'geheim');
    const werte = await ladeSteuerung(token);


     _AddVar(oArr, 'WERT_1');
     const tbl = document.getElementById('steuerung');
     _AddVar(oArr, 'WERT_2');
     werte.forEach(w => {
    _AddVar(oArr, 'WERT_3');
        const tr = document.createElement('tr');
     _AddVar(oArr, 'WERT_4');
        tr.innerHTML = `<td>${w.titel}</td><td>${w.wert} ${w.einheit}</td>`;
        tbl.appendChild(tr);
     });
}


    result := oArr.ToJSON();
zeigeTabelle();
end;
</syntaxhighlight>
</syntaxhighlight>


=PHP-Script=
==Test mit curl==
<syntaxhighlight lang="php" line="1">
<?php
    $data = [];              // hier könnten Parameter übergeben werden
    $curl = curl_init();
    $url  = '[HOSTADRESSE]:[PORT]/[ENDPUNKT]/v1';
    $url  = sprintf("%s?%s", $url, http_build_query($data));


    $headers = [
Token holen:
        'apikey: [API-KEY]'
    ];


    curl_setopt($curl, CURLOPT_URL, $url);
curl -X POST -H "apikey: [API-KEY]" -H "Content-Type: application/json" ^
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      -d "{\"username\":\"mitarbeiter\",\"password\":\"geheim\"}" ^
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
      https://api.meinserver.de/oauth/
    curl_setopt($curl, CURLOPT_TIMEOUT, 2);


    if( $result = curl_exec($curl)) {
Antwort:
        $data = json_decode($result);


        echo "<table><tr><td width='200'></td><td width='150'></td></tr>";
{"token":"eyJhbGciOi..."}


        foreach ($data as $value) {
Daten abrufen:
            echo "<tr><td>".$value->Titel."</td><td>".$value->Wert." ".$value->Einheit."</td></tr>";
 
        }
curl -H "apikey: [API-KEY]" -H "Authorization: Bearer eyJhbGciOi..." ^
      https://api.meinserver.de/steuerung/v1


        echo "</table>";
==Was zeigt das Beispiel?==
    }


    curl_close($curl);
* Zweistufige Anmeldung: API-Key + JWT.
?>
* Sichere Trennung von Konsumenten-Gruppen ueber die Audience-Claim.
</syntaxhighlight>
* Eigenes Authentifizierungs-Skript pro Zugang.
* Browser-Zugriff ueber CORS-erlaubtes Origin.

Aktuelle Version vom 19. Mai 2026, 06:58 Uhr

Kostenpflichtige Module

Internet-Shop
UPS
IMS Professional
SMS
Mehrlager-Verwaltung
Mehrsprachen Modul
Multilanguage Modul
EVA Marketing Tool
Termin-Projekte
Edifact-Schnittstelle
Backup Überwachung Email
OBS Geo Daten
DeliSprint / DPD
Filialen
Cashback
Moebelschnittstelle
Dokumenten Manager
DocuWare-Schnittstelle
OFML-Kalkulation
Versicherungsschaden
Gutschriftsanzeigen
Kameraverwaltung
DataInOut
OpenMasterData / IDS
Sammelpositionen


Beispiel 1: Daten-Abruf mit JWT-Authentifizierung

In diesem Beispiel werden Steuerungs-Variablen aus OBS abgerufen und auf einer Webseite ausgegeben. Der Zugang ist mit JWT-Pflicht eingerichtet, der Konsument muss sich daher zuerst anmelden und einen Token bezogen haben.

Einrichtung in OBS

  • Server-Profil: Standard-TLS-Profil Public-API mit Bindung 0.0.0.0:443
  • Zugang: Web-Dashboard
    • API-Key: zufaellig generiert
    • JWT aktiv, JWT-Endpunkt oauth, JWT-Key zufaellig, JWT-Exp 60 (Minuten)
    • CORS-Origins: https://dashboard.kunde.de
  • Endpunkt: steuerung/v1, dem Profil Public-API zugeordnet
  • Berechtigung: Zugang Web-Dashboard fuer Endpunkt steuerung/v1 freigeschaltet

JWT-Authentifizierungs-Skript (Zugang)

Wird ueber die Zugaenge-Liste mit F7 geoeffnet. Pruefen, ob Benutzername/Passwort gegen die OBS-Benutzerverwaltung passen.

function Authenticate(oParams: TStrings; oBody: TJSONObject): string;
var oRes  : TJSONObject;
    cUser : string;
    cPass : string;
    cSql  : string;
    qUser : TxFQuery;
begin
    oRes := TJSONObject.Create();
    try
        cUser := '';
        cPass := '';
        if (Assigned(oBody)) then begin
            oVal := oBody.GetValue('username');
            if (Assigned(oVal)) then begin
                cUser := oVal.Value;
            end;
            oVal := oBody.GetValue('password');
            if (Assigned(oVal)) then begin
                cPass := oVal.Value;
            end;
        end;
        cSql := 'SELECT u_nr, u_name FROM benutzer' +
                ' WHERE u_login = ' + DB_SQLVal(cUser) +
                ' AND u_passwort_hash = ' + DB_SQLVal(HashPasswort(cPass)) +
                ' AND u_aktiv = "1"';
        if (DB_SOpen('Y00CXXXXAA', oDB, cSql, qUser)) then begin
            oRes.AddPair('status'           , 1);
            oRes.AddPair('_OBS_JWT_ID'      , qUser.A2C('u_nr'));
            oRes.AddPair('_OBS_JWT_SUBJECT' , qUser.A2C('u_name'));
            oRes.AddPair('_OBS_JWT_AUDIENCE', 'dashboard');
        end else begin
            oRes.AddPair('status', 9);
            oRes.AddPair('error' , 'Login fehlgeschlagen');
        end;
        DB_Close(qUser);

        result := oRes.ToJSON();
    finally
        MyFreeAndNil(oRes);
    end;
end;

Endpunkt-Skript steuerung/v1

Liefert eine Liste von Steuerungs-Werten zurueck. Die Auswertung der JWT-Claims sorgt dafuer, dass nur Audience dashboard Daten erhaelt.

procedure _AddVar(oArr: TJSONArray; const cVar: string);
var oWert  : TJSONObject;
    cTitel : string;
    cData  : string;
    cEinh  : string;
    lString: Boolean;
    lAlign : Boolean;
begin
    if (ST_Variable(oDB, cVar, cTitel, cData, cEinh, lString, lAlign)) then begin
        oWert := TJSONObject.Create();
        oWert.AddPair('variable', cVar);
        oWert.AddPair('titel'   , cTitel);
        oWert.AddPair('wert'    , cData);
        oWert.AddPair('einheit' , cEinh);
        oArr.Add(oWert);
    end;
end;

//------------------------------------------------------------------------------

function Get(oParams: TStrings; oBody: TJSONObject): string;
var oArr: TJSONArray;
begin
    // Audience-Pruefung: nur Dashboard-Tokens akzeptieren
    if (oParams.Values['_OBS_JWT_AUDIENCE'] <> 'dashboard') then begin
        result := '{"error":"audience not allowed"}';
        exit;
    end;

    oArr := TJSONArray.Create();
    try
        _AddVar(oArr, 'WERT_1');
        _AddVar(oArr, 'WERT_2');
        _AddVar(oArr, 'WERT_3');
        _AddVar(oArr, 'WERT_4');
        result := oArr.ToJSON();
    finally
        MyFreeAndNil(oArr);
    end;
end;

JavaScript-Client (Browser)

Im Browser werden zwei Aufrufe gemacht: erst Token holen, dann Daten lesen.

const API_BASE = 'https://api.meinserver.de';
const API_KEY  = '[API-KEY]';

async function login(username, password) {
    const res = await fetch(`${API_BASE}/oauth/`, {
        method:  'POST',
        headers: { 'Content-Type': 'application/json', 'apikey': API_KEY },
        body:    JSON.stringify({ username, password })
    });
    if (!res.ok) throw new Error('Login fehlgeschlagen');
    const data = await res.json();
    return data.token;
}

async function ladeSteuerung(token) {
    const res = await fetch(`${API_BASE}/steuerung/v1`, {
        method:  'GET',
        headers: {
            'apikey':        API_KEY,
            'Authorization': 'Bearer ' + token
        }
    });
    if (!res.ok) throw new Error('Abruf fehlgeschlagen: ' + res.status);
    return res.json();
}

async function zeigeTabelle() {
    const token = await login('mitarbeiter', 'geheim');
    const werte = await ladeSteuerung(token);

    const tbl = document.getElementById('steuerung');
    werte.forEach(w => {
        const tr = document.createElement('tr');
        tr.innerHTML = `<td>${w.titel}</td><td>${w.wert} ${w.einheit}</td>`;
        tbl.appendChild(tr);
    });
}

zeigeTabelle();

Test mit curl

Token holen:

curl -X POST -H "apikey: [API-KEY]" -H "Content-Type: application/json" ^
     -d "{\"username\":\"mitarbeiter\",\"password\":\"geheim\"}" ^
     https://api.meinserver.de/oauth/

Antwort:

{"token":"eyJhbGciOi..."}

Daten abrufen:

curl -H "apikey: [API-KEY]" -H "Authorization: Bearer eyJhbGciOi..." ^
     https://api.meinserver.de/steuerung/v1

Was zeigt das Beispiel?

  • Zweistufige Anmeldung: API-Key + JWT.
  • Sichere Trennung von Konsumenten-Gruppen ueber die Audience-Claim.
  • Eigenes Authentifizierungs-Skript pro Zugang.
  • Browser-Zugriff ueber CORS-erlaubtes Origin.