
本文将介绍如何使用 Go 语言验证从 Android 应用获取的 Google ID Token,并提取其中的 payload。我们将使用 google-api-go-client 库的 oauth2/v2 包来实现这一目标,并针对 Google App Engine 环境进行必要的配置调整,确保验证过程顺利进行。
验证 Google ID Token 的步骤
要验证 Google ID Token 并获取 payload,需要以下几个步骤:
-
安装 google-api-go-client 库:
首先,你需要安装 google-api-go-client 库。可以使用 go get 命令:
go get google.golang.org/api/oauth2/v2
-
导入必要的包:
在你的 Go 代码中,导入以下必要的包:
import ( "context" "fmt" "log" "google.golang.org/api/oauth2/v2" "google.golang.org/api/option" ) -
创建 OAuth2 服务:
使用 oauth2/v2 包创建一个 OAuth2 服务。你需要提供一个 context.Context 和一些配置选项。
func verifyToken(idToken string) (*oauth2.Tokeninfo, error) { ctx := context.Background() // 如果在 App Engine 环境中运行,需要配置 transport // 参见:http://golangtutorials.blogspot.co.il/2011/11/using-external-api-in-go-appengine.html // 例如: // client, err := google.DefaultClient(ctx, oauth2.Oauth2ReadonlyScope) // if err != nil { // return nil, err // } // srv, err := oauth2.New(client) srv, err := oauth2.NewService(ctx, option.WithoutAuthentication()) // For non-App Engine if err != nil { log.Printf("Failed to create oauth2 service: %v", err) return nil, err } tokenInfoCall := srv.Tokeninfo() tokenInfoCall.IdToken(idToken) tokenInfo, err := tokenInfoCall.Do() if err != nil { log.Printf("Failed to verify ID token: %v", err) return nil, err } return tokenInfo, nil } -
验证 ID Token:
调用 Tokeninfo 方法,传入 ID Token。这将验证 Token 的有效性。
-
获取 Payload:
如果 Token 验证成功,你可以从返回的 Tokeninfo 结构体中获取 Payload 信息,例如 UserId、Email 等。
func main() { idToken := "YOUR_ID_TOKEN" // 替换为你的 ID Token tokenInfo, err := verifyToken(idToken) if err != nil { log.Fatalf("Failed to verify token: %v", err) } fmt.Printf("User ID: %s\n", tokenInfo.UserId) fmt.Printf("Email: %s\n", tokenInfo.Email) fmt.Printf("Audience: %s\n", tokenInfo.Audience) }
在 Google App Engine 环境中使用
如果在 Google App Engine 环境中使用,需要进行一些额外的配置。App Engine 默认情况下不允许直接访问外部 API。你需要使用 google.DefaultClient 获取一个经过配置的 HTTP 客户端,并将其传递给 oauth2.NewService 方法。
import (
"context"
"fmt"
"log"
"google.golang.org/api/oauth2/v2"
"google.golang.org/api/option"
"golang.org/x/oauth2/google"
)
func verifyToken(idToken string) (*oauth2.Tokeninfo, error) {
ctx := context.Background()
client, err := google.DefaultClient(ctx, oauth2.Oauth2ReadonlyScope)
if err != nil {
return nil, err
}
srv, err := oauth2.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Printf("Failed to create oauth2 service: %v", err)
return nil, err
}
tokenInfoCall := srv.Tokeninfo()
tokenInfoCall.IdToken(idToken)
tokenInfo, err := tokenInfoCall.Do()
if err != nil {
log.Printf("Failed to verify ID token: %v", err)
return nil, err
}
return tokenInfo, nil
}注意事项
- 确保你的 Android 应用正确地获取了 ID Token。
- 替换示例代码中的 YOUR_ID_TOKEN 为实际的 ID Token。
- 在 App Engine 环境中,确保你的应用有访问 oauth2.Oauth2ReadonlyScope 的权限。
- 始终处理错误,并记录日志以便调试。
总结
通过使用 google-api-go-client 库的 oauth2/v2 包,可以方便地在 Go 语言中验证 Google ID Token,并获取其中的 Payload 信息。对于 Google App Engine 环境,需要进行一些额外的配置以允许访问外部 API。 遵循本文的步骤,你就可以轻松地在你的 Go 后端中集成 Google ID Token 验证功能。










