OPNsense Forum

International Forums => German - Deutsch => Topic started by: Webserver01 on July 18, 2017, 05:56:16 pm

Title: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 18, 2017, 05:56:16 pm
Hallo liebe Forum-User,

Ich habe ein kleines Problem: Ich möchte, dass die Voucher mittels API-Aufruf erzeugt werden und anschließend im Webbrowser angezeigt werden. Das Projekt https://github.com/fabianfrz/OPNsense-client-library-sample habe ich schon ausprobiert leider ist das nichts für mich.

Mich interessiert im Grunde nur die API-URL, um Voucher zu erstellen, diese habe ich nicht gefunden.

Danke im Voraus!
Title: Re: API: Erzeugung von Voucher mittels API
Post by: franco on July 18, 2017, 06:33:55 pm
Hallöchen,

Die API-Aufrufe im Detail findest du hier:

https://github.com/opnsense/core/blob/master/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt

Haupt-URL ist "/api/captiveportal/voucher", der Rest ergibt sich aus dem JS-Code.

Eine detaillierte Dokumentation wird gelegentlich angefragt und wäre gut zu haben, aber ist aktuell keine Priorität für das Projekt, deswegen nur der Hinweis auf das JS.


Grüsse
Franco
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 18, 2017, 10:38:14 pm
Danke für die schnelle Antwort.

Bloß wie geht das mit dem sendData in der API-URL. Also wie muss da die URL aussehen.

Danke im voraus!
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Oxygen61 on July 18, 2017, 10:59:05 pm
Hallo Webserver01,

ich muss da etwas schmunzeln weil ich vor einiger Zeit vor Haargenau dem selben Problem stand.
"Ich will Voucher über API erzeugen und die Ausgabe dann per PDF oder HTML regeln. Hmmm wie mach ich das bloß?  ::)"

Da ich den ganzen Leidensweg mit fabian schon durch habe und er mich da erfolgreich "durchgeprügelt" hatte musst du eigentlich nur all das umsetzen was hier schon durchgekaut wurde:
https://forum.opnsense.org/index.php?topic=3810.0

Für meinen Betrieb hatte ich eine Anleitung dazu geschrieben.
Vielleicht hilft dir die und du kannst damit was anfangen:

____________________________________
 
Generierung von Voucher Codes über ein JRuby Tool

Vouchercodes können auch "extern" durch das Nutzen einer API Schnittstelle generiert und abgespeichert werden.
Dabei ist keine Veränderung des Firewall Quellcodes notwendig.
Der Zugriff auf die API Schnittstelle wird dabei gesichert über einen autorisierten API-Key durchgeführt.
Voraussetzung ist eine installierte JRuby Entwicklungsumgebung.
Hierfür den Anweisungen und Installationsanleitungen auf der Webseite folgen: http://jruby.org/
Die Ersteinrichtung des client.rb Scripts ist etwas schwerfällig,
da es ohne die Ausgabe von Fehlermeldungen geschrieben wurde.

ACHTUNG: Der Voucherserver muss bereits angelegt worden sein in OPNsense.

Eine vorbereitete Version zum Verwenden kann hier heruntergeladen werden:
Siehe Anhang: <Create-Voucher-Tool.rar>

Konfiguration:

Die Konfigurationseinstellung muss stets innerhalb des client.rb Scripts angepasst werden, da sie sonst nicht geladen wird!

Dafür unter "OPNsense-client-library-sample-master" > Rechtsklick auf "client.rb" und mit Notepad++ öffnen.
Zeile 11 innerhalb des Scripts ist die Zeile in der die Einstellungen festgelegt werden. Wichtig ist, dass die Schreibweise der Ordnerstruktur
beibehalten werden sollte wenn man leicht zum Ziel möchte.

Nachgetragen werden muss nun nur noch die "apikey.txt" Datei
im Ordner "Apikey" und das öffentliche Zertifikat der internen OPNsense Certificate Authority im .PEM Format.

Die Datei apikey.txt erzeugen:
    - Navigieren zu System > Access > Users.
    - Den Nutzer editieren, der über die API Schnittstelle kommunizieren darf.
    - Unter API keys auf das "+" Symbol klicken und die "apikey.txt" Datei
      im "Create-Voucher-Tool/Apikey" Ordner ablegen.

Die Datei Publicinternalca.crt erzeugen:
    - Internal-CA für die Web-GUI der OPNsense erzeugen und für diese ein Zertifikat ausstellen
    - Weg-GUI der OPNsense öffnen und schauen ob das von der "Internal-CA"
      ausgeschriebene Zertifikat verwenden wird.
      (Falls nicht in den OPNsense Einstellungen (Settings) abändern.)
    - Beim Internet Explorer oben links auf das Schloss-Symbol klicken > Details >
      View Certificate > Zertifizierungspfad > Internal-CA öffnen und in Datei kopieren. >
      Public-Key/Öffentliches Zertifikat "DER-codiert-binär (.CER)" exportieren.
    - Mithilfe von Unix (OpenSSL) oder der Webseite https://www.sslshopper.com/ssl-converter.html
      dieses Zertifikat auf ein .PEM umwandeln und als .crt abspeichern.
    - Die abgespeicherte .crt Datei im Ordner Create-Voucher-Tool/Zertifikate ablegen.
    ---> Client.rb Konfiguration überprüfen und falls nötig abändern.

Wenn die Konfiguration richtig erkannt und verarbeitet werden konnte öffnet sich ein Fenster mit den Reiten "Voucher" und "Einstellungen".

Kann der Reiter "Voucher" nicht gestartet werden sind die Konfigurationseinstellungen falsch und müssen überprüft werden.

Das Fenster sollte wie folgt aussehen:
Siehe Anhang: <JRuby Voucher Bild.PNG>
 
Vorteile:
    - Alternative Programm Templates und Designvorlagen nutzbar (PDF, HTML usw.)
    - Sehr Leichtes Handling
    - Nicht länger Notwendig für das Erstellen eines Vouchers die Webseite zu öffnen
    - Firewallquellcode muss nicht verändert werden
    - Zugriff und Kommunikation ist durch den API Key gesichert
    - Nachteile könnten von "Bastlern" und JRuby Programmierern leicht ausgehoben werden
    - Die Library beschränkt sich nicht nur auf Vouchers und könnte weitere Aspekte abdecken (Monitoring u.ä.)

Nachteile:
    - Vouchers sind ungültig, falls die generierte Voucher Vorlage nicht abgespeichert wurde
    - Keine Möglichkeit bereits erstellte Voucher User-Kennungen erneut anzeigen zu lassen
    - Keine variable Auswahl der Gültigkeitsdauer generierter Vouchers
    - Übersicht über erstellte Vouchers und deren Gruppen erfolgt immer noch über die Webseite

____________________________________

Ich hoffe das hilft dir weiter! :)

Schöne Grüße
Oxy
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 19, 2017, 12:00:51 am
Ersteinmal Danke für Eure fantastische Hilfe,

ich hab’s nun noch einmal anders probiert:

http://192.168.0.1/api/captiveportal/voucher/generatevouchers?data={%20%27count%27:1,%20%27validity%27:400,%20%27vouchergroup%27:%20201707%20}

Doch leider kommt die Fehlermeldung:

{"errorMessage":"Error at /usr/local/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php:132 - Missing argument 1 for OPNsense\\CaptivePortal\\Api\\VoucherController::generateVouchersAction() (errno=2)"}

In dieser Datei wird die Funktion: public function generateVouchersAction($provider) beschrieben. Die wahrscheinlich für die Anzeige der Fehlermeldungen zuständig ist. Wo liegt in meinen API-Request der Fehler?

Danke schonmal im Voraus!
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 19, 2017, 09:48:11 am
Der Fehler war das ich den Voucherprovider in der URL vergessen habe.

http://192.168.0.1/api/captiveportal/voucher/generateVouchers/voucher?count=1&voucher-validity=400&vouchergroup=2017

Nun kommt als Status error

Was mache ich falsch?
Title: Re: API: Erzeugung von Voucher mittels API
Post by: franco on July 19, 2017, 10:01:48 am
https://docs.opnsense.org/development/how-tos/api.html

1. API key für die Authentifizierung erstellen.

2. POST benutzen, da GET nur für das Abholen von Daten verwendet wird und für das Speichern durch CSRF zu gefährlich wäre.


Grüsse
Franco
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 19, 2017, 12:16:36 pm
Danke euch erstmal für die schnelle Antwort.

Nun bleibt nur noch die Frage, wie die einzelnen Formulareingabemasken heißen müssen.
So gab er mir nur die weiße Seite aus:
voucher-quantity > Anzahl
voucher-groupname > Gruppenname
voucher-validity > Gültigkeit

Danke schon mal für eure Hilfe
Title: Re: API: Erzeugung von Voucher mittels API
Post by: franco on July 19, 2017, 12:35:49 pm
Das sind die Werte, nicht die Schlüssel. :)

https://github.com/opnsense/core/blob/master/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt#L193-L195

Die POST-Vars sind die Schlüssel vor dem ":", die werte stehen dann als entsprechende Nummern /Strings dahinter.


Grüsse
Franco
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 19, 2017, 12:58:50 pm
Stimmt das habe ich komplett übersehen. Trotzdem erscheint nur eine weiße Seite.
Das ist ein Auszug aus meiner Datei:
Code: [Select]
<form action="http://192.168.0.1/api/captiveportal/voucher/generateVouchers/voucher.json" method="post">
  <div>
    <label>Anzahl</label>
    <input name="count" id="count" value="1">
  </div>
  <div>
    <label>Zeit</label>
    <input name="validity" id="validity">
  </div>
 <div>
    <label>Gruppe</label>
    <input name="vouchergroup" id="vouchergroup">
  </div>
  <div>
    <button>erstellen</button>
  </div>
</form>
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 20, 2017, 05:53:51 pm
Hallo ich bin’s nochmal,

langsam bin ich am verzweifeln. Ich habe es nochmal mit einem Javascript versucht, welches die Daten mit einem Ajax Post an den Apicontroller schickt, mit dem obigen Code und dem jRuby Client. Alles ohne Erfolg.

Hat jemand noch eine Idee?

Danke im voraus!
Title: Re: API: Erzeugung von Voucher mittels API
Post by: fabian on July 20, 2017, 08:26:54 pm
In HTTP Header müssen die Zugangsdaten stehen und der Request muss ein post sein. Außerdem muss ein Provider existieren:

Hier ist der Funktionsaufruf meines Clients:
https://github.com/fabianfrz/OPNsense_client_lib/blob/master/opnsense/voucher.rb#L14

Das erste Argument ist der Pfad hinter "api/", das zweite die struktur - das schaut dann in JSON so aus:
{"Schlüssel 1": "Wert 1", "Schlüssel 2": "Wert 2"}
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 20, 2017, 11:26:38 pm
Danke für deine Antwort.

Ich habe mir deinen Tipp mit dem HTTP-Header zu Herzen genommen und mal den Code gebastelt:
Code: [Select]
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>

<script type="text/javascript">
$(document).ready(function(){
    $("button").click(function(){
        $.ajax({
            url: "http://192.168.0.1/api/captiveportal/voucher/generateVouchers/voucher/",
            type: "POST",
            dataType: "json",
            headers: { "HeaderName": "meinApiKey" },
                    sendData={
                        'count':"1",
                        'validity':"14400",
                        'vouchergroup':"test"
                    }
        });
    });
</script>
<button>senden</button>


Wo liegt der Fehler?
Title: Re: API: Erzeugung von Voucher mittels API
Post by: fabian on July 21, 2017, 04:26:37 pm
Die Kopfzeile heißt auf jedem Fall nicht "HeaderName" ;)
https://de.wikipedia.org/wiki/HTTP-Authentifizierung#Basic_Authentication
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 21, 2017, 08:43:04 pm
Danke für deine Antwort!

Ich werde es morgen mal probieren!
Title: Re: API: Erzeugung von Voucher mittels API
Post by: Webserver01 on July 27, 2017, 06:01:24 pm
Hallo,

ich habe es nocheinmal probiert und den Quellcode des Webinterfaces durchgelesen. Dabei sind mir folgende Zeilen ausgefallen, die etwas mit dem Header zu tun haben könnten.

Code: [Select]
  $( document ).ready(function() {
                // hook into jquery ajax requests to ensure csrf handling.
                $.ajaxSetup({
                    'beforeSend': function(xhr) {
                        xhr.setRequestHeader("X-CSRFToken", "----------------------------------------" );
                        xhr.setRequestHeader("X-CSRFTokenKey", "----------------------------------------" );
                    }
                });

Die "-----" waren die Daten, die ich unkenntlich gemacht habe.

Für was sind "X-CSRFToken" und "X-CSRFTokenKey"?
Sind das zufälliger Weise die Headernamen?

Danke im vorraus
Title: Re: API: Erzeugung von Voucher mittels API
Post by: fabian on July 28, 2017, 04:17:34 pm
ja sind es - die sind aber bei nem request nicht notwendig, wenn man den request von einem tool wegschickt - die braucht man wenn cookies im spiel sind (webbrowser)