21

我正在使用“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令牌作为回报,我猜我已经发送了不记名,我认为如果是这样的话它可能需要解析?

4

5 回答 5

30

在我的情况下,服务器需要一个没有添加字符串的令牌字符串,当向 Web 服务器发送请求时,我已将 Bearer 字符串添加到标头中的令牌字符串,即

'Authorization':'Bearer ' + localStorage.getItem('id_token')

在 Web 服务器上,我们只需要拆分没有 Bearer 字符串的有效令牌

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

结果,它成为没有零的有效令牌。

于 2017-06-22T13:26:27.593 回答
16

上面的答案有点不正确,因为拆分后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>
于 2019-05-16T19:07:40.840 回答
4

信用:https ://github.com/harlow/authtoken/blob/master/authtoken.go

const BEARER_SCHEMA = "Bearer "
authHeader := req.Header.Get("Authorization")
token := authHeader[len(BEARER_SCHEMA):]
于 2019-11-27T13:18:28.380 回答
1

1)这里有函数profilehandler(作者theShivaa);

链接1:https ://gist.github.com/theShivaa/999cec98fc29d77ea47b2bdaf0a6b4fb

链接2:https ://medium.com/@theShiva5/creating-simple-login-api-using-go-and-mongodb-9b3c1c775d2f

2)要使用/测试这个功能,我在 bash shell 中运行这个命令。

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaXJzdG5hbWUiOiJwaXBwbzIiLCJsYXN0bmFtZSI6InBpcHBvMyIsInVzZXJuYW1lIjoicGlwcG8xZiJ9.MkcI4JNUgoOeMzJUhDe4dLOsK3zXSAGC9fCV5EqwA98" -X GET http://localhost:8080/profile

于 2020-10-30T23:12:00.207 回答
-3
if fmt.Sprintf("Bearer %s", pkg.FetchEnv("API_KEY")) == req.Header.Get("Authorization") {
  //OK
}
于 2021-10-04T11:39:21.810 回答