Skip to content

docker 环境 配置钉钉同步 ,但ldap 中并未同步到用户 #59

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
wokula99 opened this issue Jul 8, 2022 · 20 comments
Closed
Labels
question Further information is requested

Comments

@wokula99
Copy link

wokula99 commented Jul 8, 2022

docker 环境 配置钉钉同步
但但后台,ldap 中并未同步到用户
该如何排查。

image

@wokula99 wokula99 added the question Further information is requested label Jul 8, 2022
@eryajf
Copy link
Member

eryajf commented Jul 8, 2022

您好 @wokula99👋,我已收到您的反馈,我将安排时间考虑您提交的信息并进行回复。-- 这条信息是由自动回复的机器人发出的。

Hello @wokula99. I have received your feedback, and I will arrange time to consider the information you submitted and reply. -- This message is sent by an automatic reply robot.

@eryajf
Copy link
Member

eryajf commented Jul 8, 2022

目前后端拉下来的代码是超过前端的,还有一个动态关联字段需要配置,否则无法同步成功。
前端这块儿这周大概能上线

@wokula99
Copy link
Author

wokula99 commented Jul 8, 2022

明白了

@wokula99
Copy link
Author

刚重新下载拉取了DOCKER 镜像, 测试了下,钉钉用户没有同步到。

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

刚重新下载拉取了DOCKER 镜像, 测试了下,钉钉用户没有同步到。

字段关联关系是否已配置,然后同步的报错是什么,通过页面检查看下错误信息

@wokula99
Copy link
Author

wokula99 commented Jul 11, 2022

配置了docker-compose/config/config.yml 中的钉钉应用参数
image

怎么检查,查看错误信息

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

怎么检查,查看错误信息

通过浏览器右键检查同步接口返回内容

@wokula99
Copy link
Author

image

钉钉的小程序和H5微应用中的appKey或appSecret 都试过。确定appKey或appSecret 是正确认的。

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

你本地有没有可调试的golang环境,有的话,我给你一段代码,你可以调试下你当前的配置信息是否能正常获取钉钉里边的数据信息

@wokula99
Copy link
Author

wokula99 commented Jul 11, 2022

没有,我centost 搭个 Golang环境 很快。你发代码给我试试
image

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

通过如下代码可以获取分组与用户:

package main

import (
	"fmt"

	"github.com/zhaoyunxing92/dingtalk/v2"
	dingreq "github.com/zhaoyunxing92/dingtalk/v2/request"
)

const (
	// dingding
	DingTalkAppKey    = "xxxxxx"
	DingTalkAppSecret = "xxxxxxxxxx"
)

func DingClient() *dingtalk.DingTalk {
	client, err := dingtalk.NewClient(DingTalkAppKey, DingTalkAppSecret)
	if err != nil {
		fmt.Printf("init dingding client failed, err:%v\n", err)
	}
	return client
}

func main() {
	groups, err := GetDept()
	if err != nil {
		fmt.Printf("get all group failed: %v\n", err)
	}
	for _, group := range groups {
		fmt.Println("分组信息:", group)
	}
	users, err := GetUser()
	if err != nil {
		fmt.Printf("get all user failed: %v\n", err)
	}
	for _, user := range users {
		fmt.Println("分组信息:", user)
	}

}
func GetDept() (result []*DingTalkDept, err error) {
	rsp, err := DingClient().FetchDeptList(1, true, "zh_CN")
	if err != nil {
		fmt.Printf("get dept failed:%v\n", err)
	}
	for _, rs := range rsp.Dept {
		result = append(result, &DingTalkDept{
			Id:       rs.Id,
			Name:     rs.Name,
			Remark:   rs.Name,
			ParentId: rs.ParentId,
		})
	}
	return
}

func GetUser() ([]*DeptDetailUserInfo, error) {
	depts, err := GetDept()
	if err != nil {
		return nil, err
	}
	var users []*DeptDetailUserInfo
	for _, dept := range depts {
		r := dingreq.DeptDetailUserInfo{
			DeptId:   dept.Id,
			Cursor:   0,
			Size:     1,
			Language: "zh_CN",
		}
		for {
			rsp, err := DingClient().GetDeptDetailUserInfo(&r)
			if err != nil {
				return nil, err
			}
			for _, user := range rsp.Page.List {
				users = append(users, &DeptDetailUserInfo{
					UserId:               user.UserId,
					UnionId:              user.UnionId,
					Name:                 user.Name,
					Avatar:               user.Avatar,
					StateCode:            user.StateCode,
					ManagerUserId:        user.ManagerUserId,
					Mobile:               user.Mobile,
					HideMobile:           user.HideMobile,
					Telephone:            user.Telephone,
					JobNumber:            user.JobNumber,
					Title:                user.Title,
					WorkPlace:            user.WorkPlace,
					Remark:               user.Remark,
					LoginId:              user.LoginId,
					DeptIds:              user.DeptIds,
					DeptOrder:            user.DeptOrder,
					Extension:            user.Extension,
					HiredDate:            user.HiredDate,
					Active:               user.Active,
					Admin:                user.Admin,
					Boss:                 user.Boss,
					ExclusiveAccount:     user.ExclusiveAccount,
					Leader:               user.Leader,
					ExclusiveAccountType: user.ExclusiveAccountType,
					OrgEmail:             user.OrgEmail,
					Email:                user.Email,
				})
			}
			if !rsp.Page.HasMore {
				break
			}
			r.Cursor = rsp.Page.NextCursor
		}
	}
	return users, nil
}

type DingTalkDept struct {
	Id       int    `json:"dept_id"`
	Name     string `json:"name"`
	Remark   string `json:"remark"`
	ParentId int    `json:"parent_id"`
}

type DeptDetailUserInfo struct {
	UserId string `json:"userid"`
	// 员工在当前开发者企业账号范围内的唯一标识
	UnionId string `json:"unionid"`
	// 员工名称
	Name string `json:"name"`
	// 头像
	Avatar string `json:"avatar"`
	// 国际电话区号
	StateCode string `json:"state_code"`
	// 员工的直属主管
	ManagerUserId string `json:"manager_userid"`
	// 手机号码
	Mobile string `json:"mobile"`
	// 是否号码隐藏
	HideMobile bool `json:"hide_mobile"`
	// 分机号
	Telephone string `json:"telephone"`
	// 员工工号
	JobNumber string `json:"job_number"`
	// 职位
	Title string `json:"title"`
	// 办公地点
	WorkPlace string `json:"work_place"`
	// 备注
	Remark string `json:"remark"`
	// 专属帐号登录名
	LoginId string `json:"loginId"`
	// 所属部门ID列表
	DeptIds []int `json:"dept_id_list"`
	// 员工在部门中的排序
	DeptOrder int `json:"dept_order"`
	// 员工在对应的部门中的排序
	Extension string `json:"extension"`
	// 入职时间
	HiredDate int `json:"hired_date"`
	// 是否激活了钉钉
	Active bool `json:"active"`
	//是否为企业的管理员:
	//
	//true:是
	//
	//false:不是
	Admin bool `json:"admin"`
	// 是否为企业的老板
	Boss bool `json:"boss"`
	// 是否专属帐号
	ExclusiveAccount bool `json:"exclusive_account"`
	// 是否是部门的主管
	Leader bool `json:"leader"`
	//专属帐号类型:
	//
	//sso:企业自建专属帐号
	//
	//dingtalk:钉钉自建专属帐号
	ExclusiveAccountType string `json:"exclusive_account_type"`
	//员工的企业邮箱
	//
	//如果员工的企业邮箱没有开通,返回信息中不包含该数据
	OrgEmail string `json:"org_email"`
	//员工邮箱
	//
	//企业内部应用如果没有返回该字段,需要检查当前应用通讯录权限中邮箱等个人信息权限是否开启
	//
	//员工信息面板中有邮箱字段值才返回该字段
	//
	//第三方企业应用不返回该参数
	Email string `json:"email"`
}

创建一个目录dingding,然后执行如下命令:

go mod init dingding
go mod tidy -v
go run main.go

@wokula99
Copy link
Author

image
可以读取组和用户

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

你现在配置文件是直接在docker容器内部更改的吗,另外前后端镜像都有更新,建议你先把本地的删除,然后拉取最新的latest版本的镜像。

我估计是你更改的dingding配置信息没有作用到后端应用当中。

可以说下你的操作步骤

@wokula99
Copy link
Author

wokula99 commented Jul 11, 2022

配置文件直接这样修改的。

image

镜像是最新的。今天重新拉取的。

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

你看下我跟隔壁这位兄弟的对话,你俩是一样的情况: #63

@wokula99
Copy link
Author

改成IP 后,后台登陆不了了。。

@eryajf
Copy link
Member

eryajf commented Jul 11, 2022

不是要强行改IP,需要根据你的情况更改

让你看聊天的核心点在于配置是否有挂载到容器内部。

这些需要你自己仔细核查。

@wokula99
Copy link
Author

可以了。
我的修改项:
1、
image

2、
image

3、
image

docker-compose up -d 后,docker 运行
image

4、
docker exec -it go-ldap-admin-ui sh -c "sed -i 's@localhost:8888@1.2.3.4:8888@g' static/js/app.*.js"

@wokula99
Copy link
Author

谢谢。问题解新局面。可以关ISSUES

@eryajf
Copy link
Member

eryajf commented Jul 12, 2022

正确的方案,你已摸透了这里边的门道,恭喜。后边如果在公司里用起来了,麻烦在这里帮忙做个登记: #18

@eryajf eryajf closed this as completed Jul 12, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants