解析字符串和子字符串

时间:2017-04-13 19:44:59

标签: go

我正在尝试解码(不验证)JWT令牌并从其正文中读取值。我的代码的这部分也涉及非JWT令牌。所以我需要处理正常的令牌(比方说一些字符串)和JWT令牌。

要实现这一点,我正在用“。”分割令牌。读取JWT体值,但当我得到非JWT标记时,问题是“索引超出范围”(没有'。's)

Go Playground code

package main

import (
    "fmt"
    "strings"
    "encoding/base64"
    "encoding/json"
)

func main() {
token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
//nonJwtToken := "xxxxxxx"

    // below line should gracefull throw error if it passed nonJwtToken
    data, err := base64.RawURLEncoding.DecodeString(strings.Trim(strings.Split(token, ".")[1], "."))
    if err !=nil {
        fmt.Printf("error rahu : " , err)

    }

    var result map[string]interface{}
    err = json.Unmarshal(data, &result)
    fmt.Println(result["name"])
    fmt.Println(err)

}

请注意,我并不是要尝试验证JWT,我所做的只是解码JWT并从中读取值。

对此有任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如@RayfenWindspear的评论中所提到的,你应该检查Split返回的切片的长度,你也不需要Trim“。”来自一个字符串,它是“。”上拆分的结果。因为结果中省略了点。

ts := strings.Split(token, ".")
if len(ts) <= 1 {
    return ErrNonJWTToken
}
data, err := base64.RawURLEncoding.DecodeString(ts[1])

https://play.golang.org/p/NPw7dnBTsh