Golang验证谷歌登录token

vue3接入谷歌登录后,使用golang验证谷歌登录token

English

谷歌文档地址: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
}

说实话我也不确定这个方法是否正确,如果有更好的方法也欢迎指出,谢谢。

加载中...
📊 加载中...
感谢Jimmy | 隐私政策 | 赞赏支持
Liu 的 AI 助手