11package handlers
22
33import (
4+ "context"
45 "encoding/json"
56 "fmt"
67 "io/ioutil"
@@ -15,36 +16,50 @@ import (
1516 "github.com/authorizerdev/authorizer/server/oauth"
1617 "github.com/authorizerdev/authorizer/server/session"
1718 "github.com/authorizerdev/authorizer/server/utils"
19+ "github.com/coreos/go-oidc/v3/oidc"
1820 "github.com/gin-gonic/gin"
1921 "golang.org/x/oauth2"
2022)
2123
2224func processGoogleUserInfo (code string ) (db.User , error ) {
2325 user := db.User {}
24- token , err := oauth .OAuthProvider .GoogleConfig .Exchange (oauth2 .NoContext , code )
26+ ctx := context .Background ()
27+ oauth2Token , err := oauth .OAuthProviders .GoogleConfig .Exchange (ctx , code )
2528 if err != nil {
2629 return user , fmt .Errorf ("invalid google exchange code: %s" , err .Error ())
2730 }
28- client := oauth .OAuthProvider .GoogleConfig .Client (oauth2 .NoContext , token )
29- response , err := client .Get (constants .GoogleUserInfoURL )
30- if err != nil {
31- return user , err
31+
32+ verifier := oauth .OIDCProviders .GoogleOIDC .Verifier (& oidc.Config {ClientID : oauth .OAuthProviders .GoogleConfig .ClientID })
33+
34+ // Extract the ID Token from OAuth2 token.
35+ rawIDToken , ok := oauth2Token .Extra ("id_token" ).(string )
36+ if ! ok {
37+ return user , fmt .Errorf ("unable to extract id_token" )
3238 }
3339
34- defer response . Body . Close ()
35- body , err := ioutil . ReadAll ( response . Body )
40+ // Parse and verify ID Token payload.
41+ idToken , err := verifier . Verify ( ctx , rawIDToken )
3642 if err != nil {
37- return user , fmt .Errorf ("failed to read google response body: %s " , err .Error ())
43+ return user , fmt .Errorf ("unable to verify id_token: " , err .Error ())
3844 }
3945
40- userRawData := make (map [string ]string )
41- json .Unmarshal (body , & userRawData )
46+ // Extract custom claims
47+ var claims struct {
48+ Email string `json:"email"`
49+ Picture string `json:"picture"`
50+ GivenName string `json:"given_name"`
51+ FamilyName string `json:"family_name"`
52+ Verified bool `json:"email_verified"`
53+ }
54+ if err := idToken .Claims (& claims ); err != nil {
55+ return user , fmt .Errorf ("unable to extract claims" )
56+ }
4257
4358 user = db.User {
44- FirstName : userRawData [ "given_name" ] ,
45- LastName : userRawData [ "family_name" ] ,
46- Image : userRawData [ "picture" ] ,
47- Email : userRawData [ "email" ] ,
59+ FirstName : claims . GivenName ,
60+ LastName : claims . FamilyName ,
61+ Image : claims . Picture ,
62+ Email : claims . Email ,
4863 EmailVerifiedAt : time .Now ().Unix (),
4964 }
5065
@@ -53,7 +68,7 @@ func processGoogleUserInfo(code string) (db.User, error) {
5368
5469func processGithubUserInfo (code string ) (db.User , error ) {
5570 user := db.User {}
56- token , err := oauth .OAuthProvider .GithubConfig .Exchange (oauth2 .NoContext , code )
71+ token , err := oauth .OAuthProviders .GithubConfig .Exchange (oauth2 .NoContext , code )
5772 if err != nil {
5873 return user , fmt .Errorf ("invalid github exchange code: %s" , err .Error ())
5974 }
@@ -102,7 +117,7 @@ func processGithubUserInfo(code string) (db.User, error) {
102117
103118func processFacebookUserInfo (code string ) (db.User , error ) {
104119 user := db.User {}
105- token , err := oauth .OAuthProvider .FacebookConfig .Exchange (oauth2 .NoContext , code )
120+ token , err := oauth .OAuthProviders .FacebookConfig .Exchange (oauth2 .NoContext , code )
106121 if err != nil {
107122 return user , fmt .Errorf ("invalid facebook exchange code: %s" , err .Error ())
108123 }
0 commit comments