146 lines
3.5 KiB
Go
146 lines
3.5 KiB
Go
package service
|
|
|
|
import (
|
|
"d7y.io/dragonfly/v2/manager/auth/oauth"
|
|
"d7y.io/dragonfly/v2/manager/model"
|
|
"d7y.io/dragonfly/v2/manager/types"
|
|
"golang.org/x/oauth2/github"
|
|
"golang.org/x/oauth2/google"
|
|
)
|
|
|
|
func (s *rest) CreateOauth(json types.CreateOauthRequest) (*model.Oauth, error) {
|
|
o := model.Oauth{}
|
|
o.ClientID = json.ClientID
|
|
o.ClientSecret = json.ClientSecret
|
|
o.Name = json.Name
|
|
switch json.Name {
|
|
case "google":
|
|
o.AuthURL = google.Endpoint.AuthURL
|
|
o.TokenURL = google.Endpoint.TokenURL
|
|
o.Scopes = oauth.GoogleScopes
|
|
o.UserInfoURL = oauth.GoogleUserInfoURL
|
|
|
|
case "github":
|
|
o.AuthURL = github.Endpoint.AuthURL
|
|
o.TokenURL = github.Endpoint.TokenURL
|
|
o.Scopes = oauth.GithubScopes
|
|
o.UserInfoURL = oauth.GithubUserInfoURL
|
|
default:
|
|
o = model.Oauth{
|
|
ClientID: json.ClientID,
|
|
ClientSecret: json.ClientSecret,
|
|
Name: json.Name,
|
|
Scopes: json.Scopes,
|
|
AuthURL: json.AuthURL,
|
|
TokenURL: json.TokenURL,
|
|
UserInfoURL: json.UserInfoURL,
|
|
}
|
|
}
|
|
|
|
if err := s.db.Create(&o).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &o, nil
|
|
}
|
|
|
|
func (s *rest) DestroyOauth(id uint) error {
|
|
if err := s.db.Unscoped().Delete(&model.Oauth{}, id).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *rest) UpdateOauth(id uint, json types.UpdateOauthRequest) (*model.Oauth, error) {
|
|
oauth := model.Oauth{}
|
|
if err := s.db.First(&oauth, id).Updates(model.Oauth{
|
|
ClientID: json.ClientID,
|
|
ClientSecret: json.ClientSecret,
|
|
AuthURL: json.AuthURL,
|
|
TokenURL: json.TokenURL,
|
|
}).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &oauth, nil
|
|
}
|
|
|
|
func (s *rest) GetOauth(id uint) (*model.Oauth, error) {
|
|
oauth := model.Oauth{}
|
|
if err := s.db.First(&oauth, id).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &oauth, nil
|
|
}
|
|
|
|
func (s *rest) GetOauths() (*[]model.Oauth, error) {
|
|
oauths := []model.Oauth{}
|
|
if err := s.db.Find(&oauths).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &oauths, nil
|
|
}
|
|
|
|
func (s *rest) OauthSignin(name string) (string, error) {
|
|
oauthModel := model.Oauth{}
|
|
if err := s.db.First(&oauthModel, name).Error; err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var o oauth.Oauther
|
|
var err error
|
|
switch name {
|
|
case "google":
|
|
o, err = oauth.NewGoogleOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, s.db)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
case "github":
|
|
o, err = oauth.NewGithubOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, s.db)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
default:
|
|
o, err = oauth.NewBaseOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, oauthModel.Scopes, oauthModel.AuthURL, oauthModel.TokenURL, s.db)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
|
|
return o.AuthCodeURL(), nil
|
|
}
|
|
|
|
func (s *rest) OauthCallback(name, code string) (*model.User, error) {
|
|
oauthModel := model.Oauth{}
|
|
if err := s.db.First(&oauthModel, name).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
var o oauth.Oauther
|
|
var err error
|
|
switch name {
|
|
case "google":
|
|
o, err = oauth.NewGoogleOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, s.db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
case "github":
|
|
o, err = oauth.NewGithubOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, s.db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
default:
|
|
o, err = oauth.NewBaseOauth2(name, oauthModel.ClientID, oauthModel.ClientSecret, oauthModel.Scopes, oauthModel.AuthURL, oauthModel.TokenURL, s.db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
user, err := o.ExchangeUserByCode(code, s.db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return user, nil
|
|
}
|