首页 > 后端开发 > Golang > 正文

使用 Go 验证 Google ID Token

聖光之護
发布: 2025-10-08 13:03:01
原创
408人浏览过

使用 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 和一些配置选项。

    Google’s NSynth
    Google’s NSynth

    Google NSynth -用器学习生成的由机声音制作音乐

    Google’s NSynth 34
    查看详情 Google’s NSynth
    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 验证功能。

以上就是使用 Go 验证 Google ID Token的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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