it-swarm.com.de

Wie verwalten die Personen die Authentifizierung in Go?

Wie verwalten Sie die Authentifizierung für diejenigen, die RESTful-APIs und JS-Front-End-Apps in Go erstellen? Verwenden Sie bestimmte Bibliotheken oder Techniken?

Ich bin überrascht, so wenig darüber zu diskutieren. Ich erinnere mich an Antworten wie die folgenden und versuche, meine eigene Implementierung nicht zu entwickeln:

Authentifizierungsformular in ASP.Net

Codiert jeder seine eigene Lösung separat?

162
SexxLuthor

Diese Frage bekommt eine Unmenge von Ansichten - und hat ein Popular Question-Abzeichen - daher weiß ich, dass dieses Thema viel latentes Interesse hat, und viele Leute fragen genau das Gleiche und finden keine Antworten in den Interwebs.

Die meisten verfügbaren Informationen ergeben das textuelle Äquivalent des handgewellten Dings, das als "Übung für den Leser" übrig bleibt. ;)

Ich habe jedoch endlich ein konkretes Beispiel gefunden, das (großzügig) von einem Mitglied der golang-nuts-Verteilerliste zur Verfügung gestellt wurde:

https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ

Dies bietet ein vorgeschlagenes Schema und eine serverseitige Implementierung als Grundlage für die benutzerdefinierte Authentifizierung. Der clientseitige Code bleibt Ihnen überlassen.

(Ich hoffe, der Autor des Beitrags sieht Folgendes: Danke!)

Auszug (und neu formatiert):


"Ich würde etwas wie das folgende Design vorschlagen:

create table User (
 ID int primary key identity(1,1),
 Username text,
 FullName text,
 PasswordHash text,
 PasswordSalt text,
 IsDisabled bool
)

create table UserSession (
 SessionKey text primary key,
 UserID int not null, -- Could have a hard "references User"
 LoginTime <time type> not null,
 LastSeenTime <time type> not null
)
  • Wenn sich ein Benutzer über POST unter TLS bei Ihrer Site anmeldet, stellen Sie fest, ob das Kennwort gültig ist.
  • Geben Sie dann einen zufälligen Sitzungsschlüssel aus, sagen Sie 50 oder mehr Krypto-Rand-Zeichen und Sachen in einem sicheren Cookie.
  • Fügen Sie den Session-Schlüssel zur UserSession-Tabelle hinzu.
  • Wenn Sie diesen Benutzer wieder sehen, klicken Sie zuerst auf die UserSession-Tabelle, um zu sehen, ob der SessionKey dort mit einer gültigen LoginTime und LastSeenTime eingetragen ist und der Benutzer nicht gelöscht wird. Sie können es so gestalten, dass ein Timer automatisch alte Zeilen in UserSession löscht. "
103
SexxLuthor

Eine andere mögliche Lösung ist Authboss , die kürzlich in der Mailingliste list angekündigt wurde.

(Ich habe nicht versucht, diese Bibliothek zu verwenden.)

Siehe auch Bester Weg, um eine Webapp mit Benutzerauthentifizierung zu machen?

16
SexxLuthor

Sie würden Middleware für die Authentifizierung verwenden.

Sie können go-http-auth für die Basis- und Digest-Authentifizierung und gomniauth für OAuth2 versuchen.

Wie Sie sich authentifizieren, hängt jedoch von Ihrer App ab.

Die Authentifizierung fügt Status/Kontext in Ihre http.Handler ein und darüber wurde in letzter Zeit etwas diskutiert.

Bekannte Lösungen für das Kontextproblem sind gorilla/context und google context beschrieben hier .

Ich habe eine allgemeinere Lösung ohne die Notwendigkeit eines globalen Zustands in go-on/wrap gemacht, der zusammen oder ohne die anderen beiden verwendet werden kann und sich nahtlos in die kontextfreie Middleware integriert.

wraphttpauth ermöglicht die Integration von go-http-auth mit go-on/wrap.

14
metakeule

Ein weiteres Open Source-Paket für die Authentifizierung mit Cookies ist httpauth .

(übrigens von mir geschrieben)

6
Cameron Little

Beantworten Sie dies im Jahr 2018. Ich schlage vor, JWT (JSON Web Token) zu verwenden. Die Antwort, die Sie als gelöst markiert haben, hat einen Nachteil, dh die Fahrt, die sie vorn (Benutzer) und zurück (Server/DB) durchgeführt hat. Was noch schlimmer ist, wenn ein Benutzer häufige Abfragen durchgeführt hat, die eine Authentifizierung erfordern, führt dies zu einer aufgeblähten Anforderung von/an Server und Datenbank. Um dieses Problem zu lösen, verwenden Sie JWT, das das Token im Endgerät des Benutzers speichert, das vom Benutzer jederzeit verwendet werden kann, wenn er Zugriff/Anforderung benötigt. Es ist keine Notwendigkeit, zur Datenbank- und Server-Verarbeitung zu gelangen, um die Gültigkeit des Tokens zu überprüfen. 

5
mfathirirhas

Werfen Sie einen Blick auf Labstack Echo - es umfasst eine Authentifizierung für RESTful-APIs und Frontend-Anwendungen in Middleware, die Sie zum Schutz bestimmter API-Routen verwenden können.

Das Einrichten der Basisauthentifizierung ist zum Beispiel so einfach wie das Erstellen eines neuen Unterprogramms für die Route /admin:

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

Sehen Sie hier alle Middleware-Authentifizierungsoptionen von Labstack.

0
Adil B