
我正在学习 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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号