Maison  >  Article  >  développement back-end  >  Comment récupérer les autorisations du jeton Auth0 jwt à l'aide de go gin

Comment récupérer les autorisations du jeton Auth0 jwt à l'aide de go gin

WBOY
WBOYavant
2024-02-12 15:09:07980parcourir

如何使用 go gin 从 Auth0 jwt 令牌检索权限

Contenu de la question

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 ?

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer