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

5 回复

我们需要在导入中使用这个包 “google.golang.org/api/idtoken

并且

payload, err := idtoken.Validate(ctx, idToken, aud)

需要将 idTokenaud(即应用客户端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令牌应该由三个用点号分隔的部分组成:头部、载荷和签名。

首先检查你的令牌字符串是否完整。常见问题包括:

  1. 令牌被截断或传输过程中丢失了部分内容
  2. 令牌字符串被错误地修改或编码

以下是一个验证令牌格式的示例:

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)
}

检查要点:

  1. 确保令牌没有被截断,完整包含三个部分
  2. 检查是否有额外的空格或换行符
  3. 确认令牌没有被URL解码错误处理

如果问题仍然存在,可以打印令牌长度和前几个字符来调试:

fmt.Printf("Token length: %d\n", len(token))
fmt.Printf("First 50 chars: %s\n", token[:min(50, len(token))])

确保从Google接收令牌的代码正确处理了完整的响应体。

回到顶部