62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package google
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
|
|
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
|
"golang.org/x/oauth2"
|
|
"golang.org/x/oauth2/google"
|
|
)
|
|
|
|
type Config struct {
|
|
ClientID string
|
|
ClientSecret string
|
|
RedirectURL string
|
|
}
|
|
type Client struct {
|
|
*oauth2.Config
|
|
}
|
|
type UserInfo struct {
|
|
OpenID string `json:"id"`
|
|
Email string `json:"email"`
|
|
Name string `json:"name"`
|
|
Picture string `json:"picture"`
|
|
VerifiedEmail bool `json:"verified_email"`
|
|
}
|
|
|
|
func New(config *Config) *Client {
|
|
return &Client{
|
|
&oauth2.Config{
|
|
ClientID: config.ClientID,
|
|
ClientSecret: config.ClientSecret,
|
|
RedirectURL: config.RedirectURL,
|
|
Scopes: []string{"openid", "profile", "email", "https://www.googleapis.com/auth/user.phonenumbers.read"},
|
|
Endpoint: google.Endpoint,
|
|
},
|
|
}
|
|
}
|
|
func (c *Client) GetUserInfo(token string) (*UserInfo, error) {
|
|
client := c.Config.Client(context.Background(), &oauth2.Token{AccessToken: token})
|
|
resp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")
|
|
if err != nil {
|
|
logger.Error("[Google OAuth 2.0] Get User Info", logger.Field("error", err.Error()))
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
var userInfo map[string]interface{}
|
|
if err := json.NewDecoder(resp.Body).Decode(&userInfo); err != nil {
|
|
logger.Error("[Google OAuth 2.0] Decode User Info", logger.Field("error", err.Error()))
|
|
return nil, err
|
|
}
|
|
|
|
return &UserInfo{
|
|
OpenID: userInfo["id"].(string),
|
|
Email: userInfo["email"].(string),
|
|
Name: userInfo["name"].(string),
|
|
Picture: userInfo["picture"].(string),
|
|
VerifiedEmail: userInfo["verified_email"].(bool),
|
|
}, nil
|
|
}
|