Validating Google sign in ID token in Go

前端 未结 3 1824
半阙折子戏
半阙折子戏 2021-01-02 15:32

I am finding the way to validate ID token for Google sign-in for Android with a Go backend server project.

What is the equivalent function for validating ID tokens

相关标签:
3条回答
  • 2021-01-02 16:06

    Google's idToken is actually in JWT format, which is compact and self-contained JSON with signature.

    See also: https://jwt.io/introduction/

    google-auth-library-nodejs's OAuth2Client.prototype.verifyIdToken verify the idtoken using Google's public key and extract ClaimSet from the idtoken without calling the tokeninfo endpoint.

    I just ported the verifyIdToken function from google-auth-library-nodejs, and created a library for this: https://github.com/futurenda/google-auth-id-token-verifier.

    Usage:

    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)
    }
    
    0 讨论(0)
  • 2021-01-02 16:17

    This is how I've done it using https://github.com/google/google-api-go-client library:

    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 object has info about the user. Note that this makes a call to https://www.googleapis.com/oauth2/v2/tokeninfo and I think that all Google API Client Libraries make this http call under the hood.

    0 讨论(0)
  • 2021-01-02 16:25
    import (
        "google.golang.org/api/idtoken"
    )
    
    var token string           // this comes from your web or mobile app maybe
    const googleClientId = ""  // from credentials in the Google dev console
    
    tokenValidator, err := idtoken.NewValidator(context.Background())
    if err != nil {
        // handle error, stop execution
    }
    
    payload, err := tokenValidator.Validate(context.Background(), token, googleClientId)
    if err != nil {
        // handle error, stop execution
    }
    
    email := payload.Claims["email"]
    name  := payload.Claims["name"]
    // and so on...
    

    You may need to provide your Google credentials to your application: https://cloud.google.com/docs/authentication/production

    0 讨论(0)
提交回复
热议问题