【问题标题】:illegal base64 data at input byte 0 in gogo中输入字节0处的非法base64数据
【发布时间】:2016-12-20 08:14:58
【问题描述】:

我从 go 和 jwt 开始。

出于测试目的,我有一个硬编码的秘密。 以及获取钥匙的途径

const secretKey = "YOLOSWAG"

var mySigningKey = []byte(secretKey)


var GetTokenHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    token := jwt.New(jwt.SigningMethodHS256)
    token.Claims = jwt.MapClaims{
        "admin": true,
        "name":  "John Doe",
        "exp":   time.Now().Add(time.Hour * 24).Unix(),
    }

    tokenString, _ := token.SignedString(mySigningKey)

    w.Write([]byte(tokenString))
})

var jwtMiddleware = jwtmiddleware.New(jwtmiddleware.Options{
    ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
        return mySigningKey, nil
    },
    SigningMethod: jwt.SigningMethodHS256,
})

后来将 jwtMiddleware 添加到我的路由中

r.Handle("/protected", jwtMiddleware.Handler(ProtectedTestHandler)).Methods("GET")

所以 localhost:3000/protected 会输出错误Required authentication token not found

这行得通。

/token 将输出我的令牌。这也有效。

最后 /protected with (in postman) Authorization: Bearer {token}

将在输入字节 0 处输出非法的 base64 数据 我真的很困惑为什么会发生这种情况。

【问题讨论】:

  • 现在看不到这可能发生在哪里,但是“输入字节 0 处的非法 base64 数据”基本上意味着“我期望一个 base 64 编码的字符串,但得到了其他东西”。 (可能是解码或错误?)调试愉快。
  • 这很奇怪,因为它只有在我添加 jwtMiddleware.Handler 时才会发生。如果我删除中间件并使路由公开可访问,则没有错误。
  • 嗯,必须对 jwt 进行编码(我认为它在规范中?) base64(header) "。" base64(有效负载)“。” base64(签名)。因此,如果第一部分不是以 64 进制字符开头,则它可能没有正确编码。您应该了解如何正确使用 jwtMiddleware 库,因为这可能是它不起作用的原因。根据您的设置方式......可能是您获得的“令牌”是一个错误。无论如何,一些调试是有序的

标签: go jwt


【解决方案1】:

不要在令牌周围使用花括号。许多地方的文档令人困惑,因为它将您的令牌包装在卷曲中。它的目的是代表一个占位符。你实际上不应该用它们包装你的令牌。不要这样做。

Bearer {my-special-token}

应该是这样的

Bearer my-special-token

【讨论】:

  • 这帮助我解决了同样的问题,该死的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2018-06-18
  • 2023-03-21
  • 1970-01-01
  • 2021-03-16
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多