谷歌文档地址:https://developers.google.cn/identity/sign-in/android/backend-auth?hl=en
在上篇博客中我们完成了vue3接入谷歌登录,接下来我们来实现golang验证谷歌登录token。
本来我以为这个过程会很简单,但是我找了好多资料都不太对,问ai也是给了一些过时的或者直接就是不存在的api,官方文档说实话也没看明白,好在最后终于找到了正确的文档,验证也比较简单。
代码如下,大概思路就是拿到前端传来的jwt-token,然后通过google的api验证token,如果返回成功,验证Audience是否正确、日期是否过期等等。验证成功后获取用户信息,例如邮箱和邮箱是否验证。
package service
import (
"encoding/json"
"errors"
"fmt"
"io"
"log"
"net/http"
"strings"
)
const (
// Google 的令牌验证端点
googleTokenURL = "https://oauth2.googleapis.com/tokeninfo?id_token=%s"
googleClientID = "yourID"
)
type TokenInfo struct {
Issuer string `json:"iss"`
Audience string `json:"aud"`
ExpirationTime string `json:"exp"`
IssuedTime string `json:"iat"`
Email string `json:"email"`
EmailVerified string `json:"email_verified"`
}
func VerifyGoogleToken(token string) error {
resp, err := http.Get(fmt.Sprintf(googleTokenURL, token))
if err != nil {
return err
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
log.Println(err)
}
}(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
var tokenInfo TokenInfo
err = json.Unmarshal(body, &tokenInfo)
if err != nil {
return err
}
if !strings.Contains(tokenInfo.Audience, googleClientID) {
return errors.New("token err")
}
// 获取到用户信息,继续执行登录、注册等操作
log.Println(tokenInfo.Email)
log.Println(tokenInfo.EmailVerified)
return nil
}
说实话我也不确定这个方法是否正确,如果有更好的方法也欢迎指出,谢谢。