diff --git a/business/auth2/authprovider/dingding/dingding.go b/business/auth2/authprovider/dingding/dingding.go index 60b6cafa0..2d2ca9e7c 100644 --- a/business/auth2/authprovider/dingding/dingding.go +++ b/business/auth2/authprovider/dingding/dingding.go @@ -3,4 +3,5 @@ package dingding const ( AuthTypeDingDing = "dingding" AuthTypeStaff = "ddstaff" // 钉钉企业登录 + AuthTypeQRCode = "ddqrcode" ) diff --git a/business/auth2/authprovider/dingding/qrcode.go b/business/auth2/authprovider/dingding/qrcode.go new file mode 100644 index 000000000..5b2ea0f41 --- /dev/null +++ b/business/auth2/authprovider/dingding/qrcode.go @@ -0,0 +1,67 @@ +package dingding + +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" +) + +type QRCodeAuther struct { + authprovider.DefAuther +} + +var ( + AutherObjQRCode *QRCodeAuther +) + +func init() { + AutherObjQRCode = new(QRCodeAuther) + auth2.RegisterAuther(AuthTypeQRCode, AutherObjQRCode) +} + +func (a *QRCodeAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) { + globals.SugarLogger.Debugf("dingding qrcode VerifySecret code:%s", code) + + userQRInfo, err := api.DingDingAPI.GetUserInfoByCode(code) + if err == nil { + db := dao.GetDB() + var authBind *model.AuthBind + if authBind, err = dao.GetAuthBind(db, "", AuthTypeQRCode, userQRInfo.OpenID); dao.IsNoRowsError(err) { + 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/dingding_staff.go b/business/auth2/authprovider/dingding/staff.go similarity index 95% rename from business/auth2/authprovider/dingding/dingding_staff.go rename to business/auth2/authprovider/dingding/staff.go index b9e80a682..a5a9db6cb 100644 --- a/business/auth2/authprovider/dingding/dingding_staff.go +++ b/business/auth2/authprovider/dingding/staff.go @@ -42,7 +42,7 @@ func (a *StaffAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBi unionID := utils.Interface2String(userDetail["unionid"]) if unionID != "" { var authBindList []*model.AuthBind - if authBindList, err = dao.GetAuthBindsByAuthID2(db, unionID, []string{AuthTypeDingDing, AuthTypeStaff}); err == nil && len(authBindList) > 0 { + 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 diff --git a/controllers/auth2.go b/controllers/auth2.go index 3d680fd25..ef73ae46e 100644 --- a/controllers/auth2.go +++ b/controllers/auth2.go @@ -7,6 +7,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/password" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/jxcallback/auth" @@ -133,6 +134,36 @@ func (c *Auth2Controller) WeixinMPOAuth2() { c.Redirect(redirectURL, http.StatusTemporaryRedirect) } +// @Title 钉钉认证回调接口 +// @Description 钉钉认证回调接口,自己不能直接调用 +// @Param code query string true "客户同意后得到的code" +// @Param block query string true "回调地址" +// @Param state query string false "微信回调的登录状态" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /DingDingOAuth2 [get] +func (c *Auth2Controller) DingDingOAuth2() { + var redirectURL string + c.callDingDingOAuth2(func(params *tAuth2DingDingOAuth2Params) (retVal interface{}, errCode string, err error) { + authInfo, err := auth2.Login(dingding.AuthTypeQRCode, params.State, "", params.Code) + var callResult *CallResult + if err == nil { + callResult = &CallResult{ + Code: model.ErrCodeSuccess, + Data: string(utils.MustMarshal(authInfo)), + } + } else { + callResult = &CallResult{ + Code: model.ErrCodeGeneralFailed, + Desc: err.Error(), + } + } + redirectURL = fmt.Sprintf("%s?info=%s", params.Block, base64.StdEncoding.EncodeToString(utils.MustMarshal(callResult))) + return retVal, model.ErrorCodeIgnore, err + + }) +} + // @Title 登出接口 // @Description 登出接口(此接口兼容V1的TOKEN) // @Param token header string true "认证token"