问题内容
我正在学习 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 令牌检索权限的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!