为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中验证 Google 登录 ID 令牌

在 Go 中验证 Google 登录 ID 令牌

Go
有只小跳蛙 2022-01-04 20:55:13
我正在寻找使用 Go 后端服务器项目为 Android 的 Google 登录验证 ID 令牌的方法。在 Go 中使用 Google API 客户端库验证 ID 令牌的等效功能是什么?从这个页面上使用 Google API 客户端库部分https://developers.google.com/identity/sign-in/android/backend-auth#using-a-google-api-client-library有 Java 和 Python 示例,还有用于使用适用于 PHP、Node.js 和其他语言的 Google API 客户端库验证 ID 令牌的链接。我检查了我的目标语言;到这里https://github.com/google/google-api-go-client/blob/master/GettingStarted.md但是,我发现与 Java 和 Python 示例中验证令牌的功能不同。Go 中有什么函数可以做这样的事情吗?我不想使用令牌信息端点https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123因为它引入了可能的延迟和网络错误。我希望使用 Google API 客户端库。请指导我应该在哪里查看。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

这是我使用https://github.com/google/google-api-go-client库完成的方法:


import (

    "google.golang.org/api/oauth2/v2"

    "net/http"

)


var httpClient = &http.Client{}


func verifyIdToken(idToken string) (*oauth2.Tokeninfo, error) {

    oauth2Service, err := oauth2.New(httpClient)

    tokenInfoCall := oauth2Service.Tokeninfo()

    tokenInfoCall.IdToken(idToken)

    tokenInfo, err := tokenInfoCall.Do()

    if err != nil {

        return nil, err

    }

    return tokenInfo, nil

}

oauth2.Tokeninfo 对象包含有关用户的信息。请注意,这会调用https://www.googleapis.com/oauth2/v2/tokeninfo,我认为所有 Google API 客户端库都会在幕后进行此 http 调用。


查看完整回答
反对 回复 2022-01-04
?
绝地无双

TA贡献1946条经验 获得超4个赞

Google 的 idToken 实际上是 JWT 格式的,它是带有签名的紧凑且自包含的 JSON。


另见:https : //jwt.io/introduction/


google-auth-library-nodejs 的 OAuth2Client.prototype.verifyIdToken 使用 Google 的公钥验证 idtoken 并从 idtoken 中提取 ClaimSet,而无需调用 tokeninfo 端点。


我刚刚从 google-auth-library-nodejs 移植了 verifyIdToken 函数,并为此创建了一个库:https : //github.com/futurenda/google-auth-id-token-verifier。


用法:


import (

     "github.com/futurenda/google-auth-id-token-verifier"

)


v := googleAuthIDTokenVerifier.Verifier{}

aud := "xxxxxx-yyyyyyy.apps.googleusercontent.com"

err := v.VerifyIDToken(TOKEN, []string{

    aud,

})

if err == nil {

    claimSet, err := googleAuthIDTokenVerifier.Decode(TOKEN)

    // claimSet.Iss,claimSet.Email ... (See claimset.go)

}


查看完整回答
反对 回复 2022-01-04
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

它非常简单,并且具有单线解决方案。只需使用官方库:


go get google.golang.org/api/idtoken"

然后编写以下代码:


payload, err := idtoken.Validate(context.Background(), request.IdToken, "your google client id")

if err != nil {

    panic(err)

}

fmt.Print(payload.Claims)

然后你会得到这个输出:


map[

    aud:<Your web application client id>

    azp:<Your android application client id>

    email:<Authenticated user email> 

    email_verified:true

    exp:<expire at>

    family_name:<Authenticated user lastname>

    given_name:<Authenticated user firstname>

    iat:<issued at>

    iss: <accounts.google.com or https://accounts.google.com>

    locale:en

    name:<Authenticated User fullname>

    picture:<Authenticated User Photo URL>

    sub: <Google Account ID [Use this to identify a id uniquely]>

]


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 284 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信