戈兰授权。解析 JWT:输入字节 0 处的 base64 数据非法
Golang auth. Parsing JWT: illegal base64 data at input byte 0
我正在我的网络应用程序上制作身份验证表单。
首先,我将表单数据发送到服务器,它生成令牌并将其存储在本地存储中
然后,我想从表单页面重定向到主页。这是将令牌发送到服务器的 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
不知何故,这个问题:
输入字节 0 处存在非法 base64 数据
已通过更改我存储令牌的方式解决。我像这样存储在本地存储中:
localStorage.setItem('token', data.token)
我改到下一行,错误消失了:
localStorage.token = data.token
(数据是 JSON 我的服务器 returns 的令牌)
现在,如果我记录令牌的值,它显示时没有逗号。 @Crowman,谢谢你的回答!
编辑: 第二个问题是管道破裂,因为我没有在客户端等待答案。所以现在我更改了 JS 代码以等待响应,但我仍在努力解决如何使用 JavaScript.
显示从服务器收到的 html 页面
我正在我的网络应用程序上制作身份验证表单。
首先,我将表单数据发送到服务器,它生成令牌并将其存储在本地存储中
然后,我想从表单页面重定向到主页。这是将令牌发送到服务器的 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
不知何故,这个问题: 输入字节 0 处存在非法 base64 数据
已通过更改我存储令牌的方式解决。我像这样存储在本地存储中:
localStorage.setItem('token', data.token)
我改到下一行,错误消失了:
localStorage.token = data.token
(数据是 JSON 我的服务器 returns 的令牌)
现在,如果我记录令牌的值,它显示时没有逗号。 @Crowman,谢谢你的回答!
编辑: 第二个问题是管道破裂,因为我没有在客户端等待答案。所以现在我更改了 JS 代码以等待响应,但我仍在努力解决如何使用 JavaScript.
显示从服务器收到的 html 页面