Skip to content

Commit

Permalink
钉钉免登显示钉钉用户名和头像,配置XSRF,修复一些BUG
Browse files Browse the repository at this point in the history
  • Loading branch information
LawyZheng committed Mar 25, 2021
1 parent 350bdc4 commit 9141487
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 15 deletions.
15 changes: 15 additions & 0 deletions conf/app.conf.example
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ runmode = "${MINDOC_RUN_MODE||dev}"
sessionon = true
sessionname = mindoc_id
copyrequestbody = true
enablexsrf = true

#系统完整URL(http://doc.iminho.me),如果该项不设置,会从请求头中获取地址。
baseurl="${MINDOC_BASE_URL}"
Expand Down Expand Up @@ -209,6 +210,20 @@ log_level="${MINDOC_LOG_LEVEL||Alert}"
# 是否异步生成日志,默认是 true
log_is_async="${MINDOC_LOG_IS_ASYNC||TRUE}"

##########钉钉应用相关配置##############

# 企业钉钉ID
dingtalk_corpid="${MINDOC_DINGTALK_CORPID}"

# 钉钉AppKey
dingtalk_app_key="${MINDOC_DINGTALK_APPKEY}"

# 钉钉AppSecret
dingtalk_app_secret="${MINDOC_DINGTALK_APPSECRET}"

# 钉钉登录默认只读账号
dingtalk_tmp_reader="${MINDOC_DINGTALK_READER}"




3 changes: 1 addition & 2 deletions conf/enumerate.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ const CaptchaSessionName = "__captcha__"
const RegexpEmail = "^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"

//允许用户名中出现点号
// const RegexpAccount = `^[a-zA-Z][a-zA-Z0-9\.-]{2,50}$`
const RegexpAccount = `[a-zA-Z0-9\.-]{2,50}$`
const RegexpAccount = `^[a-zA-Z][a-zA-Z0-9\.-]{2,50}$`

// PageSize 默认分页条数.
const PageSize = 10
Expand Down
20 changes: 17 additions & 3 deletions controllers/AccountController.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,12 @@ func (c *AccountController) referer() string {

func (c *AccountController) Prepare() {
c.BaseController.Prepare()
c.EnableXSRF = true
c.EnableXSRF = beego.AppConfig.DefaultBool("enablexsrf", true)
c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
c.Data["corpID"] = beego.AppConfig.String("dingtalk_corpid")
if !c.EnableXSRF {
return
}
if c.Ctx.Input.IsPost() {
token := c.Ctx.Input.Query("_xsrf")
if token == "" {
Expand Down Expand Up @@ -138,7 +141,7 @@ func (c *AccountController) Login() {
func (c *AccountController) DingTalkLogin() {
c.Prepare()

code := c.GetString("code")
code := c.GetString("dingtalk_code")
if code == "" {
c.JsonResult(500, "获取身份信息失败", nil)
}
Expand All @@ -160,7 +163,14 @@ func (c *AccountController) DingTalkLogin() {
c.StopRun()
}

username, err := dingtalkAgent.GetUserNameByCode(code)
userid, err := dingtalkAgent.GetUserIDByCode(code)
if err != nil {
beego.Warn("钉钉自动登录失败 ->", err)
c.JsonResult(500, "自动登录失败", nil)
c.StopRun()
}

username, avatar, err := dingtalkAgent.GetUserNameAndAvatarByUserID(userid)
if err != nil {
beego.Warn("钉钉自动登录失败 ->", err)
c.JsonResult(500, "自动登录失败", nil)
Expand All @@ -171,6 +181,10 @@ func (c *AccountController) DingTalkLogin() {
if err == nil {
member.LastLoginTime = time.Now()
_ = member.Update("last_login_time")
member.Account = username
if avatar != "" {
member.Avatar = avatar
}

c.SetMember(*member)
}
Expand Down
4 changes: 0 additions & 4 deletions models/Member.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,6 @@ func (m *Member) httpLogin(account, password string) (*Member, error) {
return nil, ErrMemberAuthMethodInvalid
}

tmpH := md5.New()
tmpH.Write([]byte(password))
password = strings.ToUpper(hex.EncodeToString(tmpH.Sum(nil)))

val := url.Values{
"account": []string{account},
"password": []string{password},
Expand Down
2 changes: 1 addition & 1 deletion models/TeamMember.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ limit ?;`
for _, member := range members {
item := KeyValueItem{}
item.Id = member.MemberId
item.Text = member.Account + "(" + member.RealName + ")"
item.Text = member.Account + "[" + member.RealName + "]"
items = append(items, item)
}
result.Result = items
Expand Down
48 changes: 44 additions & 4 deletions utils/dingtalk/dingtalk.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ func NewDingTalkAgent(appSecret, appKey string) *DingTalkAgent {
}
}

// GetUserNameByCode 通过临时code获取当前用户信息
func (d *DingTalkAgent) GetUserNameByCode(code string) (string, error) {
// GetUserIDByCode 通过临时code获取当前用户ID
func (d *DingTalkAgent) GetUserIDByCode(code string) (string, error) {
urlEndpoint, err := url.Parse("https://oapi.dingtalk.com/user/getuserinfo")
if err != nil {
return "", err
Expand Down Expand Up @@ -62,8 +62,48 @@ func (d *DingTalkAgent) GetUserNameByCode(code string) (string, error) {
return "", errors.New(fmt.Sprintf("登录错误: %.0f, %s", errcode, rdata["errmsg"].(string)))
}

username := rdata["name"].(string)
return username, nil
userid := rdata["userid"].(string)
return userid, nil
}

// GetUserNameAndAvatarByUserID 通过userid获取当前用户姓名和头像
func (d *DingTalkAgent) GetUserNameAndAvatarByUserID(userid string) (string, string, error) {
urlEndpoint, err := url.Parse("https://oapi.dingtalk.com/topapi/v2/user/get")
if err != nil {
return "", "", err
}

query := url.Values{}
query.Set("access_token", d.AccessToken)

urlEndpoint.RawQuery = query.Encode()
urlPath := urlEndpoint.String()

resp, err := http.PostForm(urlPath, url.Values{"userid": {userid}})
if err != nil {
return "", "", err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", "", err
}

// 解析钉钉返回数据
var rdata map[string]interface{}
err = json.Unmarshal(body, &rdata)
if err != nil {
return "", "", err
}

errcode := rdata["errcode"].(float64)
if errcode != 0 {
return "", "", errors.New(fmt.Sprintf("登录错误: %.0f, %s", errcode, rdata["errmsg"].(string)))
}

userinfo := rdata["result"].(map[string]interface{})
username := userinfo["name"].(string)
avatar := userinfo["avatar"].(string)
return username, avatar, nil
}

// GetAccesstoken 获取钉钉请求Token
Expand Down
2 changes: 1 addition & 1 deletion views/account/login.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@
})
var formData = $("form").serializeArray()
formData.push({"name": "code", "value": info.code})
formData.push({"name": "dingtalk_code", "value": info.code})
$.ajax({
url: "{{urlfor "AccountController.DingTalkLogin"}} ",
Expand Down

0 comments on commit 9141487

Please sign in to comment.