From 8bcf464193675050023f63b1869ea949c4e095f8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 8 Mar 2019 15:55:51 +0800 Subject: [PATCH] - refactor defauther.UnionFindAuthBind --- business/auth2/authprovider/defauther.go | 44 ++++++++++++++++++- .../auth2/authprovider/dingding/qrcode.go | 35 +-------------- business/auth2/authprovider/dingding/staff.go | 40 ++--------------- business/auth2/authprovider/weixin/weixin.go | 31 ++----------- .../auth2/authprovider/weixin/weixin_mini.go | 37 ++-------------- business/jxutils/tasks/configrefresh.go | 1 + 6 files changed, 56 insertions(+), 132 deletions(-) diff --git a/business/auth2/authprovider/defauther.go b/business/auth2/authprovider/defauther.go index 6d314ba30..21fd4f30e 100644 --- a/business/auth2/authprovider/defauther.go +++ b/business/auth2/authprovider/defauther.go @@ -14,9 +14,9 @@ type DefAuther struct { // 此函数为空 func (a *DefAuther) AddAuthBind(authBindEx *auth2.AuthBindEx, userName string) (err error) { - dao.WrapAddIDCULDEntity(authBindEx, userName) + dao.WrapAddIDCULDEntity(&authBindEx.AuthBind, userName) authBindEx.Status = model.AuthBindStatusNormal - err = dao.CreateEntity(nil, authBindEx.AuthBind) + err = dao.CreateEntity(nil, &authBindEx.AuthBind) return err } @@ -37,3 +37,43 @@ func (a *DefAuther) SendVerifyCode(authID string) error { func (a *DefAuther) Logout(authInfo *auth2.AuthInfo) error { return nil } + +// 此函数用于联合(通过unionID)查找用户 +func (a *DefAuther) UnionFindAuthBind(curAuthType string, unionAuthTypeList []string, openID, unionID string, authDetail interface{}) (authBindEx *auth2.AuthBindEx, err error) { + db := dao.GetDB() + var authBind *model.AuthBind + if authBind, err = dao.GetAuthBind(db, "", curAuthType, openID); dao.IsNoRowsError(err) { // 直接找不到 + if unionID != "" { // 且有unionID + var authBindList []*model.AuthBind + if authBindList, err = dao.GetAuthBindsByAuthID2(db, unionID, unionAuthTypeList); err == nil && len(authBindList) > 0 { // 通过unionID找到至少一个认证方式 + authBind = authBindList[0] + authBind.Type = curAuthType + authBind.AuthID = openID + if authDetail != nil { + authBind.DetailData = string(utils.MustMarshal(authDetail)) + } + authBindEx = &auth2.AuthBindEx{ + AuthBind: *authBind, + } + err = a.AddAuthBind(authBindEx, "admin") // 自动绑定 + } else if dao.IsNoRowsError(err) { + err = nil + } + } else { + err = nil + } + } + if err == nil && authBindEx == nil { //如果没有报错,且没有找到一个认证方式,创建无用户(UserID为空)的认证方式 + authBindEx = &auth2.AuthBindEx{ + AuthBind: model.AuthBind{ + Type: curAuthType, + AuthID: openID, + AuthID2: unionID, + }, + } + if authDetail != nil { + authBindEx.DetailData = string(utils.MustMarshal(authDetail)) + } + } + return authBindEx, err +} diff --git a/business/auth2/authprovider/dingding/qrcode.go b/business/auth2/authprovider/dingding/qrcode.go index dc55eac0e..b5e13142f 100644 --- a/business/auth2/authprovider/dingding/qrcode.go +++ b/business/auth2/authprovider/dingding/qrcode.go @@ -4,8 +4,6 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2/authprovider" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -29,39 +27,10 @@ func (a *QRCodeAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthB userQRInfo, err := api.DingDingQRCodeAPI.GetUserInfoByCode(code) if err == nil { globals.SugarLogger.Debugf("dingding qrcode VerifySecret code:%s, userQRInfo:%s", code, utils.Format4Output(userQRInfo, false)) - db := dao.GetDB() - var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(db, "", AuthTypeQRCode, userQRInfo.OpenID); dao.IsNoRowsError(err) { - userHint := &auth2.UserBasic{ + if authBindEx, err = a.UnionFindAuthBind(AuthTypeQRCode, []string{AuthTypeDingDing, AuthTypeStaff, AuthTypeQRCode}, userQRInfo.OpenID, userQRInfo.UnionID, userQRInfo); err == nil { + authBindEx.UserHint = &auth2.UserBasic{ Name: userQRInfo.Nickname, } - if userQRInfo.UnionID != "" { - var authBindList []*model.AuthBind - if authBindList, err = dao.GetAuthBindsByAuthID2(db, userQRInfo.UnionID, []string{AuthTypeDingDing, AuthTypeStaff, AuthTypeQRCode}); err == nil && len(authBindList) > 0 { - authBind = authBindList[0] - authBind.Type = AuthTypeQRCode - authBind.AuthID = userQRInfo.OpenID - authBind.DetailData = string(utils.MustMarshal(userQRInfo)) - authBindEx = &auth2.AuthBindEx{ - AuthBind: *authBind, - UserHint: userHint, - } - err = a.AddAuthBind(authBindEx, "admin") - } else if dao.IsNoRowsError(err) { - err = nil - } - } - if err == nil && authBindEx == nil { - authBindEx = &auth2.AuthBindEx{ - AuthBind: model.AuthBind{ - Type: AuthTypeQRCode, - AuthID: userQRInfo.OpenID, - AuthID2: userQRInfo.UnionID, - DetailData: string(utils.MustMarshal(userQRInfo)), - }, - UserHint: userHint, - } - } } } return authBindEx, err diff --git a/business/auth2/authprovider/dingding/staff.go b/business/auth2/authprovider/dingding/staff.go index a5a9db6cb..b9bc6f4ce 100644 --- a/business/auth2/authprovider/dingding/staff.go +++ b/business/auth2/authprovider/dingding/staff.go @@ -4,8 +4,6 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2/authprovider" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -28,45 +26,15 @@ func (a *StaffAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBi userID, err := api.DingDingAPI.GetUserID(code) if err == nil { - db := dao.GetDB() - var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(db, "", AuthTypeStaff, userID.UserID); dao.IsNoRowsError(err) { - userDetail, err2 := api.DingDingAPI.GetUserDetail(userID.UserID) - if err = err2; err == nil { - userHint := &auth2.UserBasic{ + userDetail, err2 := api.DingDingAPI.GetUserDetail(userID.UserID) + if err = err2; err == nil { + if authBindEx, err = a.UnionFindAuthBind(AuthTypeStaff, []string{AuthTypeDingDing, AuthTypeStaff, AuthTypeQRCode}, userID.UserID, utils.Interface2String(userDetail["unionid"]), userDetail); err == nil { + authBindEx.UserHint = &auth2.UserBasic{ UserID2: userID.UserID, Mobile: utils.Interface2String(userDetail["mobile"]), Email: utils.Interface2String(userDetail["email"]), Name: utils.Interface2String(userDetail["name"]), } - unionID := utils.Interface2String(userDetail["unionid"]) - if unionID != "" { - var authBindList []*model.AuthBind - if authBindList, err = dao.GetAuthBindsByAuthID2(db, unionID, []string{AuthTypeDingDing, AuthTypeStaff, AuthTypeQRCode}); err == nil && len(authBindList) > 0 { - authBind = authBindList[0] - authBind.Type = AuthTypeStaff - authBind.AuthID = userID.UserID - authBind.DetailData = string(utils.MustMarshal(userDetail)) - authBindEx = &auth2.AuthBindEx{ - AuthBind: *authBind, - UserHint: userHint, - } - err = a.AddAuthBind(authBindEx, "admin") - } else if dao.IsNoRowsError(err) { - err = nil - } - } - if err == nil && authBindEx == nil { - authBindEx = &auth2.AuthBindEx{ - AuthBind: model.AuthBind{ - Type: AuthTypeStaff, - AuthID: userID.UserID, - AuthID2: unionID, - DetailData: string(utils.MustMarshal(userDetail)), - }, - UserHint: userHint, - } - } } } } diff --git a/business/auth2/authprovider/weixin/weixin.go b/business/auth2/authprovider/weixin/weixin.go index 5a5569aa0..59432a97b 100644 --- a/business/auth2/authprovider/weixin/weixin.go +++ b/business/auth2/authprovider/weixin/weixin.go @@ -3,11 +3,8 @@ package weixin import ( "errors" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2/authprovider" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -51,31 +48,9 @@ func (a *Auther) VerifySecret(state, code string) (authBindEx *auth2.AuthBindEx, if err = err2; err == nil { wxUserinfo, err2 := api.WeixinPageAPI.SNSGetUserInfo(token.AccessToken, token.OpenID) if err = err2; err == nil { - db := dao.GetDB() - var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(db, "", a.authType, wxUserinfo.OpenID); dao.IsNoRowsError(err) && wxUserinfo.UnionID != "" { - var authBindList []*model.AuthBind - if authBindList, err = dao.GetAuthBindsByAuthID2(db, wxUserinfo.UnionID, []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini}); err == nil && len(authBindList) > 0 { - authBind = authBindList[0] - authBind.Type = a.authType - authBind.AuthID = wxUserinfo.OpenID - authBind.DetailData = string(utils.MustMarshal(wxUserinfo)) - authBindEx = &auth2.AuthBindEx{ - AuthBind: *authBind, - } - err = a.AddAuthBind(authBindEx, wxUserinfo.NickName) - } else if dao.IsNoRowsError(err) { - err = nil - } - if err == nil && authBindEx == nil { - authBindEx = &auth2.AuthBindEx{ - AuthBind: model.AuthBind{ - Type: a.authType, - AuthID: wxUserinfo.OpenID, - AuthID2: wxUserinfo.UnionID, - DetailData: string(utils.MustMarshal(wxUserinfo)), - }, - } + if authBindEx, err = a.UnionFindAuthBind(a.authType, []string{AuthTypeWeixin, AuthTypeMini, AuthTypeMini}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil { + authBindEx.UserHint = &auth2.UserBasic{ + Name: wxUserinfo.NickName, } } } diff --git a/business/auth2/authprovider/weixin/weixin_mini.go b/business/auth2/authprovider/weixin/weixin_mini.go index dcaa22216..3d8879c14 100644 --- a/business/auth2/authprovider/weixin/weixin_mini.go +++ b/business/auth2/authprovider/weixin/weixin_mini.go @@ -4,11 +4,8 @@ import ( "encoding/base64" "errors" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/auth2/authprovider" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -35,36 +32,10 @@ func (a *MiniAuther) VerifySecret(dummy, jsCode string) (authBindEx *auth2.AuthB sessionInfo, err := api.WeixinMiniAPI.SNSCode2Session(jsCode) if err == nil { - db := dao.GetDB() - var authBind *model.AuthBind - if authBind, err = dao.GetAuthBind(db, "", AuthTypeMini, sessionInfo.OpenID); dao.IsNoRowsError(err) && sessionInfo.UnionID != "" { - var authBindList []*model.AuthBind - sessionKey := sessionInfo.SessionKey - sessionInfo.SessionKey = "" - if authBindList, err = dao.GetAuthBindsByAuthID2(db, sessionInfo.UnionID, []string{AuthTypeWeixin, AuthTypeMini, AuthTypeMini}); err == nil && len(authBindList) > 0 { - authBind = authBindList[0] - authBind.Type = AuthTypeMini - authBind.AuthID = sessionInfo.OpenID - authBind.DetailData = string(utils.MustMarshal(sessionInfo)) - authBindEx = &auth2.AuthBindEx{ - AuthBind: *authBind, - UserData: sessionKey, - } - err = a.AddAuthBind(authBindEx, "admin") - } else if dao.IsNoRowsError(err) { - err = nil - } - if err == nil && authBindEx == nil { - authBindEx = &auth2.AuthBindEx{ - AuthBind: model.AuthBind{ - Type: AuthTypeMini, - AuthID: sessionInfo.OpenID, - AuthID2: sessionInfo.UnionID, - DetailData: string(utils.MustMarshal(sessionInfo)), - }, - UserData: sessionKey, - } - } + sessionKey := sessionInfo.SessionKey + sessionInfo.SessionKey = "" + if authBindEx, err = a.UnionFindAuthBind(AuthTypeMini, []string{AuthTypeWeixin, AuthTypeMini, AuthTypeMini}, sessionInfo.OpenID, sessionInfo.UnionID, sessionInfo); err == nil { + authBindEx.UserData = sessionKey } } return authBindEx, err diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index e34b119cf..641138572 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -164,6 +164,7 @@ func RefreshWeimobToken() error { } func RefreshDingDingToken() error { + api.DingDingAPI.RetrieveToken() return RefreshConfig("dingding", dingdingTokenExpires, func() (string, string) { globals.SugarLogger.Debugf("RefreshDingDingToken RunMode:%s", beego.BConfig.RunMode) if beego.BConfig.RunMode == "prod" {