Forum: PC-Programmierung Libraries für serverseitige Authentifizierung gesucht


von P. V. (pvermeer)


Lesenswert?

Guten Tag,
ich suche nach Libraries für Client (javascript, mit oder ohne Reactjs) 
und Server, um serverseitige Authentifizierung durchzuführen. Bisher 
habe ich Http Basic Auth benutzt, möchte nun aber etwas nehmen, das 
besser zum Look&Feel der App angepasst werden kann.

Den Anbietern wie Auth0, Facebook oder Google möchte ich die 
Authentifizierung nicht überlassen, denn dabei hätte ich ein mulmiges 
Gefühl, als ob ein Vermieter zum Mieter sagt "Deine Schlüssel sind von 
einer dritten Firma nur geliehen, die können auch jederzeit in deine 
Wohnung ohne dass du es merkst, und du haftest für alles was sie dort 
tun."

Grundsätzlich könnte ich mir das ganze wohl auch selbst basteln, aber es 
gibt ja einige Fallstricke zu beachten, und wenn ich irgendetwas 
vergesse, ist meine App praktisch ungeschützt (schwächstes Glied...)

Wenn also jemand solche Libraries kennt, immer her damit. Ziel ist, 
Usern erst nach Anmeldung Zugang zu geschützten Daten zu geben.

von Klonophon (Gast)


Lesenswert?

Naja. Ich hab etwas code geschrieben im Sinne von ..

Benutzer sind in einer Datenbank angemeldet und verifiziert. Das Login 
besteht daraus, dass Name und email eingegeben werden. Die werden in der 
Datenbank gesucht. Wenn der Benutzer gefunden worden ist, wird ein login 
Link an die email gesandt. Der ist dann genau fuer die Session gueltig.

von Ergo70 (Gast)


Lesenswert?

Was spricht gegen HTTP Basic-Auth über TLS? Wenn Du den Authorization 
Header mitschickst, ploppt der hässliche Browser Dialog doch gar nicht 
erst auf...

von P. V. (pvermeer)


Lesenswert?

Klonophon schrieb:
> Naja. Ich hab etwas code geschrieben im Sinne von ..
>
> Benutzer sind in einer Datenbank angemeldet und verifiziert. Das Login
> besteht daraus, dass Name und email eingegeben werden. Die werden in der
> Datenbank gesucht. Wenn der Benutzer gefunden worden ist, wird ein login
> Link an die email gesandt. Der ist dann genau fuer die Session gueltig.

Also ist bei dir praktisch der Nutzername oder die Email das Passwort?
Das sind schon mal 2 gravierende Fehler:
1. Nutzername und Emailadresse können häufig mit ein wenig social 
engineering erraten werden.
2. Passwörter dürfen niemals nie unverschlüsselt in einer Datenbank 
erscheinen.

Es geht mir schon darum, ein sicheres System zu erhalten. Von daher 
scheiden solche laienhaften Ansätze aus, und ich möchte zuverlässige 
Libraries verwenden.

von P. V. (pvermeer)


Lesenswert?

Ergo70 schrieb:
> Was spricht gegen HTTP Basic-Auth über TLS? Wenn Du den
> Authorization
> Header mitschickst, ploppt der hässliche Browser Dialog doch gar nicht
> erst auf...

Es war mir nicht bekannt, dass dies möglich ist, aber du scheinst recht 
zu haben. Die Frage ist nur, wie muss der Authorization Header genau 
erzeugt werden? Hast du einen guten Link dazu, der vielleicht auch die 
Sicherheit dieser Methode diskutiert? Ich fange auch mal an, nach 
weiteren Details zu suchen. Danke!

von Ergo70 (Gast)


Lesenswert?

Den Header kannst Du mit Javascript hinzufügen, z.B. so:

https://coderseye.com/2007/how-to-do-http-basic-auth-in-ajax.html

Wie genau das mit reactJS geht, weiß ich nicht. Würde mich aber wundern, 
wenn es das nicht auch könnte.

Wie sicher das ist? Na ja, so sicher wie die TLS Verbindung. Wenn jemand 
die Übertragung abhören kann, hat er User + Password im Klartext. Und es 
muss ebenfalls sichergestellt sein, dass kein fremdes Script auf Deiner 
Loginseite die Variablen abschnorchelt und irgendwo anders hin schickt. 
Also diese Seite muss ganz der Kontrolle durch deine Applikation 
unterliegen und der Browser sollte same-origin und CORS können: 
https://de.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

Jetzt kannst Du Dir noch überlegen, ob Du dann jedesmal User+Password 
mitschicken willst, oder nach dem Login ein Bearer-Token ausstellst, das 
nur für diese Anmeldung gültig ist. Vorteil: Das Token kann zeitlich 
begrenzt gültig sein, so dass ein Angreifer, der es irgendwie doch in 
die Finger bekommt, nur eine begrenzte Zeit Zugriff hat. Weiterhin 
verrät so ein Token weniger über den Benutzer, als sein Passwort, das ja 
möglicherweise auch anderswo gültig ist und man kann es im Verdachtsfall 
ungültig setzen, ohne den User komplett auszusperren.

Dann bist Du aber fast bei OAuth2 oder SAML. Du könntest Deinen eigenen 
Login-Server betreiben, wenn Du Dritten nicht traust. Guck mal bei CAS 
https://apereo.github.io/cas/5.3.x/ oder Keycloak 
https://www.keycloak.org/

Ich persönlich finde CAS besser - aber rechne in jedem Fall mit ein paar 
Tagen Einarbeitungszeit.

von Wolfgang (Gast)


Lesenswert?

P. V. schrieb:
> Also ist bei dir praktisch der Nutzername oder die Email das Passwort?
> Das sind schon mal 2 gravierende Fehler:
> 1. Nutzername und Emailadresse können häufig mit ein wenig social
> engineering erraten werden.

Was nützen bei dem (erratener) Nutzername und Emailadresse, wenn man 
keinen Zugang zum E-Mail-Konto hat.

von Ergo70 (Gast)


Lesenswert?

Sehe gerade, Du hast sowieso schon sowas wie ein Session Token. Dann 
sollte der Header schon reichen...

von P. V. (pvermeer)


Lesenswert?

Ergo70 schrieb:
> Wie sicher das ist? Na ja, so sicher wie die TLS Verbindung. Wenn jemand
> die Übertragung abhören kann, hat er User + Password im Klartext.

Das ist eigentlich auch schon ein Ausschlusskriterium. Mit gehashtem 
Passwort+Salt geht das nicht?

> Dann bist Du aber fast bei OAuth2 oder SAML. Du könntest Deinen eigenen
> Login-Server betreiben, wenn Du Dritten nicht traust. Guck mal bei CAS
> https://apereo.github.io/cas/5.3.x/ oder Keycloak
> https://www.keycloak.org/

Einen eigenen Loginserver würde ich schon aufsetzen. Doch CAS sieht mir 
reichlich komplex aus, muss ich mir mal genauer ansehen.

von P. V. (pvermeer)


Lesenswert?

Ich bin nun noch auf https://jwt.io/ gestoßen. Allerdings soll denen ein 
grober Fehler unterlaufen sein, indem das Token direkt den 
Hashingalgorithmus vorgibt und so eben auch die hash-Prüfung ausschalten 
kann. Da fragt man sich, was sonst noch an Dummheiten drinsteckt.

Und sowas kommt von Auth0...

von P. V. (pvermeer)


Lesenswert?

Was ich im Zusammenhang mit jwt.io fragen wollte... sind euch Ansätze 
bekannt, wie man darauf aufbauend relativ einfach einen 
Authentifizierungsprozess implementiert?

von Ergo70 (Gast)


Lesenswert?

Das mit der fehlerhaften Behandlung des alg Feldes wurde bereits 2015 
gefixt: 
https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/

Schwerwiegender ist eher, das man JWTs nicht explizit revoken kann, die 
können nur nach einer gewissen Zeit ablaufen. Das ist gleichzeitig der 
größte Vorteil, das Token enthält alle notwendigen Informationen, man 
muss nicht nochmal irgendwo nachfragen. Damit hängt die Sicherheit aber 
komplett an der Signatur und der Sicherheit des Transportweges . Gerät 
der private Schlüssel in die Hände eines Angreifers, kann der sich 
selber beliebige, gültige JWT ausstellen. Kann er ein JWT abhören, kann 
er einen Replay-Agriff durchführen.

Ansonsten ist das eigentlich cool. Hier 
http://postgrest.org/en/v5.1/auth.html#client-auth kannst Du z.B. sehen, 
wie man damit authentifiziert.

Du brauchst halt eine Stelle, die auf Basis irgendeiner 
Identitätsprüfung JWts ausstellt und Deine Anwendung muss diese 
auswerten können. In Deinem Fall könntest Du z.B. ein JWT ausstellen und 
in den Login-Link einbauen, den Du dann in der EMail schickst...

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

Du solltest keine eigene Authentifizierung schreiben, das geht immer in 
die Hose. Aus deinen Texten schließe ich, dass du Passwörter als 
text/plain speicherst. Du brauchst zuerst eine vernünftige 
Benutzerverwaltung, soetwas wie Keycloak. Damit bekommst du ein 
Rollenkonzept, Tokens und reichlich Hashing und Verschlüsselung. Wenn 
dir das zu dick ist, machst du HTTP Digest und/oder HTTP Form Based. Ein 
richtiger Web-Server wie ein Apache (nginx o.ä.) liefert da schon genug 
Dokumentation und Fähigkeiten mit. Keinesfalls solltest irgendeinen 
JavaScript-Murks machen, es sei denn, du möchtest wegen Datenreichtums 
ausgelacht werden.

von P. V. (pvermeer)


Lesenswert?

Ergo70 schrieb:
> In Deinem Fall könntest Du z.B. ein JWT ausstellen und
> in den Login-Link einbauen, den Du dann in der EMail schickst...

Bestimmt... Dieser Quatsch mit Login-Link per Email kam von Herrn 
Klonophon, nicht von mir. Email zum registrieren ist ok, aber ich 
schicke den Kunden doch nicht für jeden Login eine Email. Dann habe ich 
nämlich ganz schnell keinen Kunden mehr, wenn die denken, ich bin im 20. 
Jahrhundert hängengeblieben.

von P. V. (pvermeer)


Lesenswert?

Boris O. schrieb:
> Du solltest keine eigene Authentifizierung schreiben, das geht immer in
> die Hose.

Genau deshalb frage ich nach Libraries. Einfach mal meine Frage 
durchlesen.

> Aus deinen Texten schließe ich, dass du Passwörter als
> text/plain speicherst.

Und aus deinem Gebrabbel schließe ich, dass du erstens nicht lesen 
kannst und zweitens überhaupt keine Ahnung von nichts hast, aber 
trotzdem mitspielen möchtest. Sorry, abgelehnt!

von Purzel H. (hacky)


Lesenswert?

>> PV ..
>> Bestimmt... Dieser Quatsch mit Login-Link per Email kam von Herrn
Klonophon, nicht von mir. Email zum registrieren ist ok, aber ich
schicke den Kunden doch nicht für jeden Login eine Email. Dann habe ich
nämlich ganz schnell keinen Kunden mehr, wenn die denken, ich bin im 20.
Jahrhundert hängengeblieben.


Eine Frage, wie oft sich die Kunden den einloggen sollen. Ich habe auch 
die email login methode implementiert fuer die Adressnachfuehrung in 
einem Verein. Da logt man sich sowieso nur einmal im Jahr ein, oder so.
Die Standardanfrage an den Administrator war, hat dich fest : ich habe 
mein passwort vergessen ... Will ich nicht mehr beantworten. Das email 
genuegt. Ausser es hat gewechselt. Dann muss man eben durch.

Und ich habe eine Online Zeitung, da geschieht das login auch ueber 
email - ja, das ist nervend.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.