web-dev-qa-db-fra.com

Comment les personnes gèrent-elles l'authentification dans Go?

Pour ceux qui construisent des API RESTful et des applications frontales JS dans Go, comment gérez-vous l'authentification? Utilisez-vous des bibliothèques ou des techniques particulières?

Je suis surpris de trouver si peu de discussion à ce sujet. Je garde à l’esprit les réponses suivantes et essaie d’éviter de développer ma propre implémentation:

Formulaire d'authentification en ASP.Net

Est-ce que tout le monde code sa propre solution, séparément?

162
SexxLuthor

Cette question suscite beaucoup d'opinions - et porte le badge Question populaire -, je sais donc que ce sujet suscite beaucoup d'intérêt, et que de nombreuses personnes demandent exactement la même chose et ne trouvent pas de réponses sur Interwebs.

La plupart des informations disponibles résultent en l’équivalent textuel de la chose ondulée à la main, laissée comme un "exercice pour le lecteur". ;)

Cependant, j'ai finalement trouvé un exemple concret, fourni (généreusement) par un membre de la liste de diffusion golang-nut:

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

Ceci fournit un schéma suggéré et une implémentation côté serveur comme base pour une authentification personnalisée. Le code côté client est toujours à vous.

(J'espère que l'auteur du post voit ceci: Merci!)

Extrait (et reformaté):


"Je suggérerais quelque chose comme le design suivant:

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
)
  • Lorsqu'un utilisateur se connecte à votre site via un POST sous TLS, déterminez si le mot de passe est valide.
  • Emettez ensuite une clé de session aléatoire, par exemple 50 caractères Rand crypto ou plus, et insérez-la dans un cookie sécurisé.
  • Ajoutez cette clé de session à la table UserSession.
  • Ensuite, lorsque vous reverrez cet utilisateur, commencez par consulter la table UserSession pour voir si la clé SessionKey est présente avec un LoginTime et LastSeenTime valides et si l'utilisateur n'est pas supprimé. Vous pouvez le concevoir de sorte qu'un minuteur efface automatiquement les anciennes lignes de UserSession. "
103
SexxLuthor

Une autre solution possible est Authboss , récemment annoncé sur le mailing list .

(Je n'ai pas essayé d'utiliser cette bibliothèque.)

Voir aussi Le meilleur moyen de créer une application Web avec une autorisation utilisateur?

16
SexxLuthor

Vous utiliseriez un middleware pour effectuer l'authentification.

Vous pouvez essayer go-http-auth pour l'authentification de base et digest et gomniauth pour OAuth2.

Mais l'authentification dépend vraiment de votre application.

L'authentification introduit l'état/le contexte dans votre http.Handlers et il y a eu des discussions à ce sujet récemment.

Les solutions bien connues au problème de contexte sont gorilla/context et google context description ici .

J'ai mis au point une solution plus générale ne nécessitant pas un état global in go-on/wrap qui peut être utilisé ensemble ou sans les deux autres et s'intègre parfaitement au middleware sans contexte.

wraphttpauth fournit l'intégration de go-http-auth avec go-on/wrap.

14
metakeule

Un autre paquet open source permettant de gérer l’authentification avec des cookies est httpauth .

(écrit par moi, au fait)

6
Cameron Little

Répondre à cela en 2018. Je suggère d'utiliser JWT (JSON Web Token). La réponse que vous avez marquée comme résolue a un inconvénient, à savoir le trajet effectué avant (utilisateur) et arrière (serveur/base de données). Ce qui est pire si l’utilisateur effectuait fréquemment des demandes nécessitant une autorisation se traduirait par une demande surchargée de/vers le serveur et la base de données. Pour résoudre ce problème, utilisez JWT, qui stocke le jeton dans l'utilisateur final. Cet jeton peut être utilisé par l'utilisateur à tout moment s'il a besoin d'un accès/demande. Pas besoin d'aller à la base de données et au traitement du serveur pour vérifier la validité du jeton prend peu de temps. 

5
mfathirirhas

Jetez un coup d'oeil à Labstack Echo -, il encapsule l'authentification pour les API RESTful et les applications frontales dans un middleware que vous pouvez utiliser pour protéger des routes d'API spécifiques.

La configuration de l'authentification de base, par exemple, est aussi simple que de créer un nouveau sous-routeur pour la 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
}))

Voir toutes les options d'authentification de middleware de Labstack ici.

0
Adil B