2017-07-30 154 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文件系統中的公鑰)

的任何問題發生那樣的情況讓我知道。我可以給你幫助。