Estoy usando Golang y el marco de la ginebra para obtener reclamaciones de un JWT enviado desde un cliente. Pero no puedo comparar los roles extraídos con una cadena.

Cuando intento obtener el valor, devuelve [test-app] pero en realidad quiero el valor como "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")
   }
} 

Y mi carga útil

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

¿Cómo puedo obtener el valor de JSON reclamaciones y usarlo para comparar / validar con una cadena?

2
Neung K 15 jul. 2019 a las 05:32

1 respuesta

La mejor respuesta

La reclamación roles en la carga útil JWT es una matriz, por lo que también podría contener valores múltiples, por ejemplo. "roles":["test-app", "production-app"]

chkRoles es, por lo tanto, un slice que contiene estos valores. Podrías acceder a ellos por índice, por ejemplo. chkRoles[0], pero si no sabe en qué posición encontrará el valor que está buscando, puede iterar a la rebanada como esta:

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

Con este código lo descubrirá, si la reclamación roles contiene el valor "la aplicación de prueba".

Aquí tienes un programa completo:

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
            }
        }
    }
}

Un ejemplo de trabajo completo se puede ver y probar en el patio de marcha

1
jps 22 jul. 2019 a las 12:50