如何使用 go gin 从 Auth0 jwt 令牌检索权限
短信预约 -IT技能 免费直播动态提醒
问题内容
我正在学习 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 令牌检索权限的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341