78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
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
|
|
}
|