登录
首页 >  Golang >  Go问答

如何验证 JWT 的角色声明中是否包含特定值?

来源:stackoverflow

时间:2024-03-10 23:33:24 411浏览 收藏

本篇文章给大家分享《如何验证 JWT 的角色声明中是否包含特定值?》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在使用 golang 和 gin 框架从客户端发送的 jwt 获取声明。但我无法将提取的角色与字符串进行比较。

当我尝试获取该值时,它返回 [test-app] 但实际上我想要的值为 "test-app"

token, _, err := new(jwt.parser).parseunverified(tokenstring, jwt.mapclaims{})
if err != nil {
    fmt.println(err2)
    return
}

if claims, ok := token.claims.(jwt.mapclaims); ok {
   chkroles := claims["roles"]

   if chkroles == "test-app" {
        fmt.println("check roles passed")
   }
}

和我的有效负载

{
        "roles": [
            "test-app"
        ],
        "exp": 1811749673,
        "client_id": "testapp"
    }

如何从 json 声明中获取值并使用它与字符串进行比较/验证?


解决方案


jwt 负载中的 rolesclaim 是一个数组,因此它也可以包含多个值,例如"角色":["测试应用程序", "生产应用程序"]

chkroles 因此是包含这些值的 slice。 您可以通过索引访问它们,例如chkroles[0],但如果您不知道在哪个位置可以找到您要查找的值,您可以像这样迭代切片:

chkroles := claims["roles"].([]interface{})
for _, role:=range chkroles {
  if role == "test-app" {
    fmt.println("check roles passed")
    break
  }
}

通过此代码,您将发现 rolesclaim 是否包含值“test-app”。

这是一个完整的程序:

package main

import (
    "fmt"
    "github.com/dgrijalva/jwt-go"   
)

func main() {
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJyb2xlcyI6WyJ0ZXN0LWFwcCIsInByb2R1Y3Rpb24tYXBwIl0sImlhdCI6MTUxNjIzOTAyMn0.4VHXYkAXgFkgbQ524ijVClPVJb0GuXRtAVNp3yuGwvA"

    token, _, err := new(jwt.Parser).ParseUnverified(tokenString, jwt.MapClaims{})
    if err != nil {
        fmt.Println(err)
        return
    }

    if claims, ok := token.Claims.(jwt.MapClaims); ok {

        chkRoles := claims["roles"].([]interface{})

        for _, role := range chkRoles {
            if role == "test-app" {
                fmt.Println("Check Roles passed")
                break
            }
        }
    }
}

可以查看和测试完整的工作示例 on the Go Playground

终于介绍完啦!小伙伴们,这篇关于《如何验证 JWT 的角色声明中是否包含特定值?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>