【问题标题】:Golang auth. Parsing JWT: illegal base64 data at input byte 0戈朗认证。解析 JWT:输入字节 0 处的非法 base64 数据
【发布时间】:2023-03-21 10:42:01
【问题描述】:

我正在我的网络应用上制作身份验证表单。

首先,我将表单数据发送到服务器,它生成令牌并将其存储在本地存储中

然后,我想从表单页面重定向到主页。这是将令牌发送到服务器的 JavaScript,以便我在主页上被视为授权用户:

const xhr = new XMLHttpRequest()
xhr.open('GET', '/')
xhr.setRequestHeader('Authorization', localStorage.token)
xhr.send()
xhr.onload  = () => {
if(xhr.status >= 400) {
    console.log("error")
  }
}

xhr.onerror = () => {
    console.log("error")
}

然后我想检查令牌并显示主页。这是它的 Golang 函数:

func (h *Handler) Home_page(c *gin.Context) {
header := c.GetHeader("Authorization")
    if header != "" {
        _, err := h.services.Authorization.ParseToken(header)
        if err != nil {
            newErrorResponse(c, http.StatusUnauthorized, err.Error())
            return
        }
        c.HTML(
            http.StatusOK,
            "home_page.gohtml",
            gin.H{
                "IsAuth": true,
            },
        )
        return
    }
}

ParseToken 函数:


func (s *AuthService) ParseToken(accessToken string) (int, error) {
    token, err := jwt.ParseWithClaims(accessToken, &tokenClaims{}, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, errors.New("invalid signing method")
        }
        return []byte(signingKey), nil //signingKey is a string with random elements
    })
    if err != nil {
        return 0, err
    }

    claims, ok := token.Claims.(*tokenClaims)
    if !ok {
        return 0, errors.New("token claims are not of type *tokenClaims")
    }

    return claims.UserId, nil
}

问题是我得到了这个错误:

ERRO[0001] 输入字节 0 处的 base64 数据非法

我已经在 jwt.io 上检查了令牌,它表明令牌已经过验证,可能问题出在我作为令牌传递的字符串类型上。

另一个问题是,如果我不检查从令牌验证返回的错误,主页不会显示此错误:

http: panic serving [::1]:50490: write tcp [::1]:8083->[::1]:50490: write: broken pipe


我是 Golang 的新手,一直在努力解决这个问题,尽管它看起来很典型。

非常感谢有关如何处理令牌或从身份验证表单重定向的任何帮助!


编辑:我正在使用https://github.com/golang-jwt/jwt/v4

【问题讨论】:

  • 我建议您首先记录 header 的值并验证它实际上是什么。
  • @Crowman,感谢您的回答!我已经记录了标题的值。它打印:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDE2MTMxOTcsImlhdCI6MTY0MTU2OTk5NywiVXNlcklkIjoyfQ.NV7Aj5mwJgeOFmhL3UP0srXtk1lD8cAgC2MxxhaOF6c" 这个值是一个有效的令牌(我在 jwt.io 上用我使用秘密 base64 的勾号检查了它)
  • 但问题依旧

标签: json go authentication jwt base64


【解决方案1】:

不知何故,这个问题: 输入字节 0 处的非法 base64 数据

已通过更改我存储令牌的方式来解决。我像这样存储在本地存储中:


localStorage.setItem('token', data.token)

我改到下一行,错误消失了:

localStorage.token = data.token

(数据是我的服务器返回的带有令牌的 JSON)

现在,如果我记录令牌的值,它会显示为不带逗号。 @Crowman,谢谢你的回答!

编辑:发生了第二个管道损坏问题,因为我没有在客户端等待答案。所以现在我更改了 JS 代码以等待响应,但我仍然在努力解决如何使用 JavaScript 显示从服务器接收到的 html 页面。

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2016-12-20
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多