J'apprends le go et je souhaite configurer une application simple utilisant auth0. À l'aide de leur didacticiel, j'ai pu configurer l'authentification de base pour mon point de terminaison API. Maintenant, je souhaite ajouter la gestion des autorisations à l'aide du jeton jwt. J'ai donc activé RBAC pour le point de terminaison de l'API et ajouté des autorisations. J'ai utilisé le flux du didacticiel pour les déclarations personnalisées, mais j'ai écrit mon propre middleware avec et je l'ai adapté pour fonctionner avec Gin.
func NeedsPermission(expectedScope string) gin.HandlerFunc { return func(context *gin.Context) { token := context.Request.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims) claims := token.CustomClaims.(*CustomClaims) if !claims.HasScope(expectedScope) { context.AbortWithStatus(403) } context.Next() } }
Le problème est qu'il n'y a pas de revendications personnalisées dans le jeton, seulement les revendications par défaut : revendications openid, profile et email.
Voici le contenu du jeton :
{ "iss": "https://dev-****.us.auth0.com/", "sub": "google-oauth2|****", "aud": [ "localhost:3000/books", "https://dev-****.us.auth0.com/userinfo" ], "iat": 1701789297, "exp": 1701875697, "azp": "***", "scope": "openid profile email", "permissions": [ "read:books" ] }
Il a donc une autorisation de champ, mais comment puis-je y accéder en utilisant auth0/go-jwt-middleware ou dois-je d'abord le décoder d'une manière ou d'une autre ?
Les autorisations sont des déclarations personnalisées, vous devez donc réussir l'implémentation WithCustomClaims
选项以及 validator.CustomClaims
de l'interface.
Puis lorsque vous créez le validateur :
... jwtValidator, _ := validator.New( keyFunc, validator.HS256, issuer, audience, validator.WithCustomClaims(func() validator.CustomClaims { return &MyClaims{} }), ) mw := jwtmiddleware.New(jwtValidator.ValidateToken) ...
Parmi eux MyClaims
是这样的。请注意您的 HasScope
méthode :
type MyClaims struct { Permissions []string `json:"permissions"` } func (c *MyClaims) Validate(ctx context.Context) error { // Validate structure of permissions here, i.e. check for 400 not 403 return nil } func (c MyClaims) HasScope(requiredPerm string) bool { for _, perm := range c.Permissions { if perm == requiredPerm { return true } } return false }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!