我正在try 编写一个函数来验证Google id令牌.

oauth2 package要求我在创建新服务时通过上下文,如下所示:

package services

import (
    "context"
    "google.golang.org/api/oauth2/v2"
)

func ValidateToken(ctx *context.Context, idToken string) {
    // I need to pass context.Context in to the oauth2 library
    oauth2Service, err := oauth2.NewService(*ctx)
    tokenInfoCall := oauth2Service.Tokeninfo()
    tokenInfoCall.IdToken(idToken)
    tokenInfo, err := tokenInfoCall.Do()

在Beego this.Ctx中,是Beego上下文模块的一个实例,因此此代码不会编译:

func (c *TokenController) Post(ctx *context.Context) {
    requestParams := struct {
        Google_id_token string
    }{}
    err := json.Unmarshal(c.Ctx.Input.RequestBody, &requestParams)
    // Type mismatch
    services.ValidateToken(c.Ctx, requestParams.Google_id_token)

我怎样才能到达需要传递给OAuth2库的上下文?

编辑:我正在通过传递上下文来解决这个问题.Background(),但我不确定自己是否完全理解这种方法的副作用.我对Golang很陌生,感觉背景背景应该只在"更高"的层次上使用?

func ValidateToken(idToken string) {
    ctx := context.Background()
    oauth2Service, err := oauth2.NewService(ctx)

推荐答案

试试这个:c.Ctx.Request.Context()

也不要在函数ValidateToken的arg ctx中使用指针,因为上下文.stdlib中的上下文是接口

Go相关问答推荐

在Golang中,@LATEST和@UPGRADE特殊查询有什么不同?

Go中的net.SplitHostPort(r.RemoteAddr)安全性

如果第一次匹配条件,如何跳过切片中的值

用 fork 替换 Go 依赖:...用于两个不同的模块路径

如何根据地址和大小打印字符串

在 Windows 11 上运行 go mod tidy 时的 gitlab 权限问题

io.Reader 无限循环与 fmt.Fscan

如何使用 sync.WaitGroup 来执行所有的 goroutine?

自定义 Fyne 自适应网格布局

如何从 Go 中的 `HijackedResponse` 中删除 Cursor Position ANSI 转义码?

Golang 中的泛型类型转换

SSH 代理,数据包长度错误

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

Golang Gin 绑定请求正文 XML 到 Slice

如何将多个切片打印为一个切片?

在 GORM 中,如何在特定时区配置 autoCreateTime 和 autoUpdateTime?

Go 中 SDL Surface 的 OpenGL 纹理

有没有办法在 golang 中定义可索引类型?

Closed channel与nil channel

GORM 不忽略带有 `gorm:"-"` 的字段