如何检查 JWT 的角色声明(值数组)的某个值?
How to check roles claim (array of values) of a JWT for a certain value?
我正在使用 Golang 和 Gin 框架从客户端发送的 JWT 中获取声明。但是我无法将提取的角色与字符串进行比较。
当我尝试获取值时,它 returns [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 声明中获取值并将其用于 compare/validate 字符串?
JWT 负载中的 roles
claim 是一个数组,因此它也可以包含多个值,例如"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
}
}
使用此代码,您会发现 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
}
}
}
}
可以看到并测试完整的工作示例on the Go Playground
我正在使用 Golang 和 Gin 框架从客户端发送的 JWT 中获取声明。但是我无法将提取的角色与字符串进行比较。
当我尝试获取值时,它 returns [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 声明中获取值并将其用于 compare/validate 字符串?
JWT 负载中的 roles
claim 是一个数组,因此它也可以包含多个值,例如"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
}
}
使用此代码,您会发现 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
}
}
}
}
可以看到并测试完整的工作示例on the Go Playground