在 Go 中验证 Google 登录 ID 令牌

我正在寻找使用 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 客户端库。请指导我应该在哪里查看。


有只小跳蛙
浏览 285回答 3
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 调用。

绝地无双

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)}

猛跑小猪

它非常简单,并且具有单线解决方案。只需使用官方库:go get google.golang.org/api/idtoken"然后编写以下代码:payload, err := idtoken.Validate(context.Background(), request.IdToken, "your google client id")if err != nil {&nbsp; &nbsp; panic(err)}fmt.Print(payload.Claims)然后你会得到这个输出:map[&nbsp; &nbsp; aud:<Your web application client id>&nbsp; &nbsp; azp:<Your android application client id>&nbsp; &nbsp; email:<Authenticated user email>&nbsp;&nbsp; &nbsp; email_verified:true&nbsp; &nbsp; exp:<expire at>&nbsp; &nbsp; family_name:<Authenticated user lastname>&nbsp; &nbsp; given_name:<Authenticated user firstname>&nbsp; &nbsp; iat:<issued at>&nbsp; &nbsp; iss: <accounts.google.com or https://accounts.google.com>&nbsp; &nbsp; locale:en&nbsp; &nbsp; name:<Authenticated User fullname>&nbsp; &nbsp; picture:<Authenticated User Photo URL>&nbsp; &nbsp; sub: <Google Account ID [Use this to identify a id uniquely]>]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go