From d55faab175a826501fa60728e742619cd91d74eb Mon Sep 17 00:00:00 2001 From: yokowu <18836617@qq.com> Date: Tue, 15 Jul 2025 11:41:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(oauth):=20=E4=BF=AE=E5=A4=8D=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89OAuth=20email=E5=AD=97=E6=AE=B5=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/domain/oauth.go | 1 + backend/internal/user/usecase/user.go | 60 ++++++++++----------------- backend/pkg/oauth/custom.go | 1 + 3 files changed, 25 insertions(+), 37 deletions(-) diff --git a/backend/domain/oauth.go b/backend/domain/oauth.go index 3735ec9..eefba5b 100644 --- a/backend/domain/oauth.go +++ b/backend/domain/oauth.go @@ -20,6 +20,7 @@ type OAuthConfig struct { IDField string NameField string AvatarField string + EmailField string } type OAuthUserInfo struct { diff --git a/backend/internal/user/usecase/user.go b/backend/internal/user/usecase/user.go index 106d788..0931333 100644 --- a/backend/internal/user/usecase/user.go +++ b/backend/internal/user/usecase/user.go @@ -367,18 +367,14 @@ func (u *UserUsecase) DeleteAdmin(ctx context.Context, id string) error { return u.repo.DeleteAdmin(ctx, id) } -func (u *UserUsecase) OAuthSignUpOrIn(ctx context.Context, req *domain.OAuthSignUpOrInReq) (*domain.OAuthURLResp, error) { - setting, err := u.repo.GetSetting(ctx) - if err != nil { - return nil, err - } +func (u *UserUsecase) getOAuthConfig(setting *db.Setting, platform consts.UserPlatform) (*domain.OAuthConfig, error) { cfg := domain.OAuthConfig{ Debug: u.cfg.Debug, - Platform: req.Platform, + Platform: platform, RedirectURI: fmt.Sprintf("%s/api/v1/user/oauth/callback", u.cfg.BaseUrl), } - switch req.Platform { + switch platform { case consts.UserPlatformDingTalk: if setting.DingtalkOauth == nil || !setting.DingtalkOauth.Enable { return nil, errcode.ErrDingtalkNotEnabled @@ -398,11 +394,25 @@ func (u *UserUsecase) OAuthSignUpOrIn(ctx context.Context, req *domain.OAuthSign cfg.IDField = setting.CustomOauth.IDField cfg.NameField = setting.CustomOauth.NameField cfg.AvatarField = setting.CustomOauth.AvatarField + cfg.EmailField = setting.CustomOauth.EmailField default: return nil, errcode.ErrUnsupportedPlatform } - oauth, err := oauth.NewOAuther(cfg) + return &cfg, nil +} + +func (u *UserUsecase) OAuthSignUpOrIn(ctx context.Context, req *domain.OAuthSignUpOrInReq) (*domain.OAuthURLResp, error) { + setting, err := u.repo.GetSetting(ctx) + if err != nil { + return nil, err + } + cfg, err := u.getOAuthConfig(setting, req.Platform) + if err != nil { + return nil, err + } + + oauth, err := oauth.NewOAuther(*cfg) if err != nil { return nil, err } @@ -465,37 +475,13 @@ func (u *UserUsecase) FetchUserInfo(ctx context.Context, req *domain.OAuthCallba if err != nil { return nil, err } - cfg := domain.OAuthConfig{ - Debug: u.cfg.Debug, - Platform: session.Platform, - RedirectURI: fmt.Sprintf("%s/api/v1/user/oauth/callback", u.cfg.BaseUrl), + + cfg, err := u.getOAuthConfig(setting, session.Platform) + if err != nil { + return nil, err } - switch session.Platform { - case consts.UserPlatformDingTalk: - if setting.DingtalkOauth == nil || !setting.DingtalkOauth.Enable { - return nil, errcode.ErrDingtalkNotEnabled - } - cfg.ClientID = setting.DingtalkOauth.ClientID - cfg.ClientSecret = setting.DingtalkOauth.ClientSecret - case consts.UserPlatformCustom: - if setting.CustomOauth == nil || !setting.CustomOauth.Enable { - return nil, errcode.ErrCustomNotEnabled - } - cfg.ClientID = setting.CustomOauth.ClientID - cfg.ClientSecret = setting.CustomOauth.ClientSecret - cfg.AuthorizeURL = setting.CustomOauth.AuthorizeURL - cfg.Scopes = setting.CustomOauth.Scopes - cfg.TokenURL = setting.CustomOauth.AccessTokenURL - cfg.UserInfoURL = setting.CustomOauth.UserInfoURL - cfg.IDField = setting.CustomOauth.IDField - cfg.NameField = setting.CustomOauth.NameField - cfg.AvatarField = setting.CustomOauth.AvatarField - default: - return nil, errcode.ErrUnsupportedPlatform - } - - oauth, err := oauth.NewOAuther(cfg) + oauth, err := oauth.NewOAuther(*cfg) if err != nil { return nil, err } diff --git a/backend/pkg/oauth/custom.go b/backend/pkg/oauth/custom.go index 37d5aef..ce31033 100644 --- a/backend/pkg/oauth/custom.go +++ b/backend/pkg/oauth/custom.go @@ -52,6 +52,7 @@ func (c *CustomOAuth) GetUserInfo(code string) (*domain.OAuthUserInfo, error) { ID: fmt.Sprint(info[c.cfg.IDField]), AvatarURL: fmt.Sprint(info[c.cfg.AvatarField]), Name: fmt.Sprint(info[c.cfg.NameField]), + Email: fmt.Sprint(info[c.cfg.EmailField]), }, nil }