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 调用。
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)
}
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]>
]
- 3 回答
- 0 关注
- 284 浏览
添加回答
举报