如何检查JWT的角色声明(值数组)是否包含特定值?

4
我正在使用Golang和Gin框架从客户端获取JWT中的claims。但是我无法将提取的角色与字符串进行比较。
当我尝试获取该值时,它返回`[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声明中获取值并将其用于与字符串进行比较/验证?


chkRoles是一个切片,将其与字符串进行比较没有多少意义。 - zerkms
1个回答

4

JWT载荷中的roles声明是一个数组,因此它也可以包含多个值,例如:"roles":["test-app", "production-app"]

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

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

使用以下代码,您可以确定roles声明是否包含值“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
            }
        }
    }
}

您可以在Go Playground上查看并测试一个完整的工作示例


你能解释一下或者提供关于这个的文档链接吗:.([]interface{})?感谢你的回答。 - orpheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接