2017-07-30 47 views
0

我目前正在研究Golang应用程序。我从客户端接收JWT令牌,并在Go中需要解码该令牌并获取信息:用户,名称等。可用于处理JWT令牌的库,我下降到this之一,但我不知道如何简单地做出我需要的东西。 我有令牌,我需要解码信息到地图或至少一个JSON。我在哪里可以找到如何操作的指南? 谢谢!解码Golang中的JWT令牌

+0

https://github.com/dgrijalva/jwt-go/blob/master/example_test.go – zerkms

+0

@zerkms我已经看到了它,但在那个例子中,我应该有我将要去的数据结构接收,在这种情况下,MyCustomClaims,但可以很容易地从另一侧改变,我不想重新构造任何时候添加或删除的东西 –

+0

可能重复[Go语言和验证JWT](https:// stackoverflow .com/questions/41077953/go-language-and-verify-jwt) –

回答

1

功能jwt.ParseWithClaims接受作为第二个参数的接口jwt.Claims。除基于结构的定制声明外,该程序包还提供基于map的声明,即jwt.MapClaims。因此,您可以简单地将令牌解码为MapClaims,例如,

tokenString := "<YOUR TOKEN STRING>"  
claims := jwt.MapClaims{} 
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { 
    return []byte("<YOUR VERIFICATION KEY>"), nil 
}) 
// ... error handling 

// do something with decoded claims 
for key, val := range claims { 
    fmt.Printf("Key: %v, value: %v\n", key, val) 
} 
1

使用github.com/dgrijalva/jwt-go去实现。我们可以按照以下方式从api请求中提取JWT令牌信息。

从使用发布请求发布JWT令牌时。您必须在路由部分提取JWT信息。

func RequireTokenAuthentication(inner http.Handler) http.Handler { 
     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      token, err := jwt.ParseFromRequest(
       r, 
       func(token *jwt.Token) (interface{}, error) { 
        return VERIFICATION.PublicKey, nil 
       }) 
      if err != nil || !token.Valid) { 
       log.Debug("Authentication failed " + err.Error()) 
       w.WriteHeader(http.StatusForbidden) 
       return 
      } else { 
       r.Header.Set("username", token.Claims["username"].(string)) 
       r.Header.Set("userid", strconv.FormatFloat((token.Claims["userid"]).(float64), 'f', 0, 64)) 
      } 
      inner.ServeHTTP(w, r) 
     }) 
    } 

VERIFICATION.PublicKey:用于验证的密钥(得到public.key文件系统中的公钥)

的任何问题发生那样的情况让我知道。我可以给你帮助。