Golang中遇到错误 "idtoken: invalid token, token must have three segments; found 2" 怎么解决
Golang中遇到错误 “idtoken: invalid token, token must have three segments; found 2” 怎么解决 我正在使用这个包“https://github.com/googleapis/google-api-go-client/blob/master/idtoken/validate.go#L27-L28”来验证由Google签发的idToken。但是我遇到了错误“invalid token, token must have three segments; found 2”。IdToken的格式是正确的。请指导。
更多关于Golang中遇到错误 "idtoken: invalid token, token must have three segments; found 2" 怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我们需要在导入中使用这个包 “google.golang.org/api/idtoken”
并且
payload, err := idtoken.Validate(ctx, idToken, aud)
需要将 idToken 和 aud(即应用客户端ID)传递给上述函数。
更多关于Golang中遇到错误 "idtoken: invalid token, token must have three segments; found 2" 怎么解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我对 ID 令牌一无所知,但产生该错误的代码似乎位于此处:
segments := strings.Split(idToken, ".")
if len(segments) != 3 {
return nil, fmt.Errorf("idtoken: invalid token, token must have three segments; found %d", len(segments))
}
令牌中是否包含两个“.”字符?您能否发布一个示例令牌,其中部分或全部字母数字字符已被混淆处理?
我无法复现这个问题,因为我遇到了构建错误。以下是我为了尝试而编写的 main.go 文件:
package main
import (
"context"
"fmt"
"github.com/googleapis/google-api-go-client/idtoken"
)
func main() {
_, err := idtoken.Validate(context.Background(), "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", "")
fmt.Println("err:", err)
}
但是当我尝试运行它时,我得到了这个错误:
package command-line-arguments
imports github.com/googleapis/google-api-go-client/idtoken
..\..\github.com\googleapis\google-api-go-client\idtoken\compute.go:15:2: use of internal package google.golang.org/api/internal not allowed
是否有其他方法来验证这个 JWT?
令牌格式正确。我已通过硬编码方式在代码中测试过。例如,我将令牌放在一行中,它工作正常。但当令牌换行时,就会报错。
从技术上讲,我使用的是Goa Web框架,并通过Postman进行测试。 content-type: application/json
为了更好地解释,我从 jwt.io 获取了一个示例令牌。
情况1: 如果令牌换行,如下所示格式,则会抛出错误。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
情况2: 如果令牌在一行中,则工作正常。 请注意,为了便于理解,我在此处删除了一些令牌内容,但在原始情况下,完整的令牌位于一行中。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OD.kwIiwibmFtZSI6Ik
我考虑使用“minify”函数。也许这应该是一个解决方法。如果您找到更好的解决方案,请帮助我。
这个错误通常表示你提供的ID Token格式不符合JWT标准。JWT令牌应该由三个用点号分隔的部分组成:头部、载荷和签名。
首先检查你的令牌字符串是否完整。常见问题包括:
- 令牌被截断或传输过程中丢失了部分内容
- 令牌字符串被错误地修改或编码
以下是一个验证令牌格式的示例:
package main
import (
"fmt"
"strings"
"github.com/googleapis/google-api-go-client/idtoken"
)
func validateTokenFormat(token string) error {
segments := strings.Split(token, ".")
if len(segments) != 3 {
return fmt.Errorf("invalid token, token must have three segments; found %d", len(segments))
}
return nil
}
func main() {
// 你的ID Token
idToken := "your.jwt.token.here"
// 先验证格式
if err := validateTokenFormat(idToken); err != nil {
fmt.Printf("Token format error: %v\n", err)
return
}
// 使用idtoken包验证
payload, err := idtoken.Validate(ctx, idToken, "your-audience")
if err != nil {
fmt.Printf("Validation error: %v\n", err)
return
}
fmt.Printf("Token validated: %+v\n", payload)
}
检查要点:
- 确保令牌没有被截断,完整包含三个部分
- 检查是否有额外的空格或换行符
- 确认令牌没有被URL解码错误处理
如果问题仍然存在,可以打印令牌长度和前几个字符来调试:
fmt.Printf("Token length: %d\n", len(token))
fmt.Printf("First 50 chars: %s\n", token[:min(50, len(token))])
确保从Google接收令牌的代码正确处理了完整的响应体。

