【问题标题】:How to check roles claim (array of values) of a JWT for a certain value?如何检查某个值的 JWT 的角色声明(值数组)?
【发布时间】:2020-05-03 20:04:31
【问题描述】:

我正在使用 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 声明中获取值并使用它与字符串进行比较/验证?

【问题讨论】:

  • chkRoles 是一个切片,将它与字符串进行比较几乎没有意义。

标签: json go jwt jwt-go


【解决方案1】:

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

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

【讨论】:

  • 您能否解释或链接到文档以了解其工作原理:.([]interface{})?谢谢你的回答。
猜你喜欢
  • 2020-06-03
  • 2019-11-29
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多