我正在學習 go,想使用 auth0 設定一個簡單的應用程式。 使用他們的教程,我能夠為我的 api 端點設定基本身份驗證。 現在我想使用 jwt 令牌來新增權限處理。 因此,我為 api 端點啟動了 RBAC 並添加了權限。 我使用教程中的流程進行自訂聲明,但用它編寫了我自己的中間件並將其調整為與杜松子酒一起使用。
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() } }
問題是令牌中沒有自訂聲明,只有預設聲明:openid、個人資料和電子郵件聲明。
這是令牌內容:
{ "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" ] }
所以它確實有一個字段權限,但是我如何使用 auth0/go-jwt-middleware 訪問它,或者我必須先以某種方式解碼它?
權限是自訂聲明,因此您需要傳遞 WithCustomClaims
選項以及 validator.CustomClaims
介面的實作。
然後當您建立驗證器時:
... jwtValidator, _ := validator.New( keyFunc, validator.HS256, issuer, audience, validator.WithCustomClaims(func() validator.CustomClaims { return &MyClaims{} }), ) mw := jwtmiddleware.New(jwtValidator.ValidateToken) ...
其中 MyClaims
是這樣的。請注意您的 HasScope
方法:
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 }
以上是如何使用 go gin 從 Auth0 jwt 令牌檢索權限的詳細內容。更多資訊請關注PHP中文網其他相關文章!