Go 如何提取和验证从前端发送的令牌

Go 如何提取和验证从前端发送的令牌,go,jwt,token,jwt-go,Go,Jwt,Token,Jwt Go,我正在使用“github.com/dgrijalva/jwt go”,能够向我的前端发送令牌,我想知道如何检索从前端发送的令牌,以便我能够验证发送的令牌是否有效,如果有效,安全资源将被交付 以下是从前端JavaScript发送的令牌: headers: { 'Authorization':'Bearer' + localStorage.getItem('id_token') } 这是发送令牌的代码 token := jwt.New(jwt.GetSigningM

我正在使用“github.com/dgrijalva/jwt go”,能够向我的前端发送令牌,我想知道如何检索从前端发送的令牌,以便我能够验证发送的令牌是否有效,如果有效,安全资源将被交付

以下是从前端JavaScript发送的令牌:

headers: {
       'Authorization':'Bearer' + localStorage.getItem('id_token')
     }
这是发送令牌的代码

    token := jwt.New(jwt.GetSigningMethod("HS256"))
    claims := make(jwt.MapClaims)
    claims["userName"] = loginRequest.UserName
    claims["exp"] = time.Now().Add(time.Minute * 60).Unix()
    token.Claims = claims
    tokenString, err := token.SignedString([]byte(SecretKey))
    tokenByte, err := json.Marshal(data)
    w.WriteHeader(201)
    w.Write(tokenByte)
下面是验证令牌的代码

    func VerifyToken(r *http.Request) bool {

    reqToken := r.Header.Get("Authorization")
    token, err := jwt.Parse(reqToken, func(t *jwt.Token) (interface{}, error) {
        return []byte(SecretKey), nil
    })
    if err == nil && token.Valid {
        fmt.Println("valid token")
        return true
    } else {
        fmt.Println("invalid token")
        return false
    }

}

我得到了nil令牌作为返回,我猜我已经发送了bearer,我认为可能需要解析,如果是这样的话怎么办?

服务器需要一个没有添加字符串的令牌字符串在我的情况下,我在向web服务器发送请求时,在头中的令牌字符串中添加了bearer字符串,即

'Authorization':'Bearer ' + localStorage.getItem('id_token')
在web服务器上,我们只需要拆分没有承载字符串的有效令牌

reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer ")
reqToken = splitToken[1]

因此,它成为不带nil的有效令牌

上面的答案有点不正确,因为在拆分
reqToken
之后,
splitToken
中应该只有一个值,即令牌本身

假设令牌的格式如下:

'Authorization': 'Bearer <YOUR_TOKEN_HERE>'
“授权”:“持票人”
这是标准格式-字符串“Bearer”和实际令牌本身之间有一个空格

以下代码将执行正确的令牌提取:

reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
if len(splitToken) != 2 {
    // Error: Bearer token not in proper format
}

reqToken = strings.TrimSpace(splitToken[1])

fmt.Println(reqToken) // <YOUR_TOKEN_HERE>
reqToken:=r.Header.Get(“授权”)
splitToken:=strings.Split(reqToken,“承载者”)
如果len(拆分令牌)!=2 {
//错误:承载令牌格式不正确
}
reqToken=strings.TrimSpace(splitToken[1])
格式打印项次(reqToken)//
学分:

1) 这里是函数profilehandler(作者theShivaa)

链接1:

链接2:

2) 要使用/测试此函数,我在bashshell中运行以下命令


curl-i-H“Accept:application/json”-H“Content Type:application/json”-H“Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyjmaxjgzdg5hbwuioijwaxbwbwbziilcjsyxn0bmftzsi6inbpchbvmyisinvzzjuyy1lijoicglwcgcg8xzij9.mkci4jnugoozjuhde4dloskzxsagc9fcv5eqwa98”-X得到http://localhost:8080/profile

这仅在您的令牌如下时才起作用:
Bearer{token}
当承载令牌的标准格式为
Bearer{token}
时,在您的示例中,您在令牌前面携带一个空格(由于拆分),这是一件坏事。拆分字符串时,您应该包含空格,或者将其横向修剪。是的,它应该是“承载者”(注意空格)。否则您将获得“输入字节0处的非法base64数据”,您需要在索引1处获得
splitToken
。并且还要验证
splitToken
的长度是否为2。如果
授权
值短于
“Bearer”
,则会死机。最好通过
strings.HasPrefix()
const BEARER_SCHEMA = "Bearer "
authHeader := req.Header.Get("Authorization")
token := authHeader[len(BEARER_SCHEMA):]