- qrcode auth for dingding
This commit is contained in:
@@ -3,4 +3,5 @@ package dingding
|
||||
const (
|
||||
AuthTypeDingDing = "dingding"
|
||||
AuthTypeStaff = "ddstaff" // 钉钉企业登录
|
||||
AuthTypeQRCode = "ddqrcode"
|
||||
)
|
||||
|
||||
67
business/auth2/authprovider/dingding/qrcode.go
Normal file
67
business/auth2/authprovider/dingding/qrcode.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user