package google import ( "context" "encoding/json" "io" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "base/internal/pkg/oauth/types" ) type client struct { oauthConfig *oauth2.Config } func New(config oauth2.Config) types.Oauth { oauthConfig := &oauth2.Config{ ClientID: config.ClientID, ClientSecret: config.ClientSecret, Endpoint: google.Endpoint, RedirectURL: config.RedirectURL, Scopes: config.Scopes, } return &client{oauthConfig: oauthConfig} } func (g client) GetConsentAuthUrl(ctx context.Context, state string) string { return g.oauthConfig.AuthCodeURL(state, oauth2.AccessTypeOffline) } func (g client) ExchangeCodeWithToken(ctx context.Context, code string) (*types.Token, error) { exchange, err := g.oauthConfig.Exchange(ctx, code, oauth2.AccessTypeOffline) if err != nil { return nil, err } token, err := g.oauthConfig.TokenSource(ctx, exchange).Token() if err != nil { return nil, err } return &types.Token{ AccessToken: token.AccessToken, TokenType: token.TokenType, RefreshToken: token.RefreshToken, ExpiresIn: token.ExpiresIn, }, nil } func (g client) GetUserInfo( ctx context.Context, accessToken string, refreshToken string, ) (types.UserInfo, error) { resp, err := g.oauthConfig.Client( ctx, &oauth2.Token{ AccessToken: accessToken, RefreshToken: refreshToken, }).Get("https://www.googleapis.com/oauth2/v2/userinfo") if err != nil { return nil, err } defer resp.Body.Close() data, err := io.ReadAll(resp.Body) if err != nil { return nil, err } var user UserInfo if err = json.Unmarshal(data, &user); err != nil { return nil, err } return &user, err }