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

2024年 2月 12日 106.1k 0

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

问题内容

我正在学习 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)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论