- qrcode auth for dingding

This commit is contained in:
gazebo
2019-03-08 10:52:02 +08:00
parent 9a071dcbbe
commit d633a35a26
4 changed files with 100 additions and 1 deletions

View File

@@ -3,4 +3,5 @@ package dingding
const (
AuthTypeDingDing = "dingding"
AuthTypeStaff = "ddstaff" // 钉钉企业登录
AuthTypeQRCode = "ddqrcode"
)

View File

@@ -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
}

View File

@@ -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

View File

@@ -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"