【问题标题】:How to extract and verify token sent from frontend如何提取和验证从前端发送的令牌
【发布时间】:2017-01-23 21:36:57
【问题描述】:

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

【问题讨论】:

    标签: go jwt token jwt-go


    【解决方案1】:

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

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

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

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

    因此,它成为没有 nil 的有效令牌。

    【讨论】:

    • 这只有在你的令牌是这样的时候才有效:Bearer{token} 当不记名令牌的标准格式是Bearer {token}时
    • 在您的示例中,您在令牌前面带有一个空格(作为拆分的结果),这是一件坏事。您应该在拆分字符串时包含空格或稍后修剪它
    • 是的,应该是“Bearer”(注意空格)。否则,您将在输入字节 0 处获得“非法 base64 数据”
    【解决方案2】:

    上面的答案有点不正确,因为拆分reqToken后,splitToken中应该只有一个值,就是token本身。

    假设令牌的格式如下:

    '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>
    

    【讨论】:

    • 您需要在索引 1 处获取 splitToken。还要验证 splitToken 的长度是否为 2
    【解决方案3】:

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

    const BEARER_SCHEMA = "Bearer "
    authHeader := req.Header.Get("Authorization")
    token := authHeader[len(BEARER_SCHEMA):]
    

    【讨论】:

    • 如果Authorization 的值比"Bearer " 短,这将导致恐慌——最好通过strings.HasPrefix() 确保
    【解决方案4】:

    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 中运行这个命令。

    卷曲-i -H “接受:应用/ JSON” -H “内容类型:应用/ JSON” -H “授权:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaXJzdG5hbWUiOiJwaXBwbzIiLCJsYXN0bmFtZSI6InBpcHBvMyIsInVzZXJuYW1lIjoicGlwcG8xZiJ9.MkcI4JNUgoOeMzJUhDe4dLOsK3zXSAGC9fCV5EqwA98” -X GET HTTP://本地主机:8080 /简档

    【讨论】:

      【解决方案5】:
      if fmt.Sprintf("Bearer %s", pkg.FetchEnv("API_KEY")) == req.Header.Get("Authorization") {
        //OK
      }
      

      【讨论】:

      • Bearer token 不应该是API key,通常是JWT
      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 2019-05-27
      • 1970-01-01
      • 2015-12-13
      • 2022-07-08
      • 2020-11-28
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多