0

0

使用 Go 验证 Google ID Token

聖光之護

聖光之護

发布时间:2025-10-08 13:03:01

|

424人浏览过

|

来源于php中文网

原创

使用 go 验证 google id token

本文将介绍如何使用 Go 语言验证从 Android 应用获取的 Google ID Token,并提取其中的 payload。我们将使用 google-api-go-client 库的 oauth2/v2 包来实现这一目标,并针对 Google App Engine 环境进行必要的配置调整,确保验证过程顺利进行。

验证 Google ID Token 的步骤

要验证 Google ID Token 并获取 payload,需要以下几个步骤:

  1. 安装 google-api-go-client 库:

    首先,你需要安装 google-api-go-client 库。可以使用 go get 命令:

    go get google.golang.org/api/oauth2/v2
  2. 导入必要的包:

    在你的 Go 代码中,导入以下必要的包:

    import (
        "context"
        "fmt"
        "log"
    
        "google.golang.org/api/oauth2/v2"
        "google.golang.org/api/option"
    )
  3. 创建 OAuth2 服务:

    使用 oauth2/v2 包创建一个 OAuth2 服务。你需要提供一个 context.Context 和一些配置选项。

    DeepAI
    DeepAI

    为天生具有创造力的人提供的AI工具

    下载
    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
    }
  4. 验证 ID Token:

    调用 Tokeninfo 方法,传入 ID Token。这将验证 Token 的有效性。

  5. 获取 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 验证功能。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6070

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

794

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1054

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1180

2024.03.01

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

262

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1729

2023.08.22

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.4万人学习

CSS教程
CSS教程

共754课时 | 18.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号