Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-12 15:09:07
avant
979 Les gens l'ont consulté

如何使用 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()
    }
}
Copier après la connexion

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"
  ]
}
Copier après la connexion

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)
    ...
Copier après la connexion

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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!