钉钉实现扫码登录

实现背景

我们小组用的是钉钉办公,所以我们开发一些网站都是服务于小组内成员,也就是企业内部钉钉用户,在之前已经实现了将钉钉用户信息同步在数据库中,所以我们直接根据钉钉开发文档实现第三方登录。

具体思路

1.数据库已经同步到企业内部所有成员的信息,等于说所有用户都已经注册过了
2.实现扫码登录,通过用户钉钉登录或钉钉扫码登录获取用户信息,然后根据获取的信息在数据库中验证身份,得到完整信息,并生成该用户登录的token,并将用户信息存入token请求头,实现完整登录过程。

参考文档和在线接口测试

第三方登录文档

获取用户token

企业内部api在线测试上面这个接口

获取通讯录个人信息

企业内部api在线测试上面这个接口

具体演示过程

1.根据钉钉官方给定的网址(网址中包含你最后要跳转到的你的项目地址)进入,让用户授权
我的网址:

https://login.dingtalk.com/oauth2/challenge.htm?redirect_uri=http://47.98.212.252/&response_type=code&client_id=dingjfxu75nqiffmdbb8&scope=openid&prompt=consent

在这里插入图片描述

2.登录之后网址上会获取authCode=2091bc1e2d8630ae84bf06844721c5d4,这个码只能用一次,具有即时性,也有过期时间
当你还没有写后端逻辑,没有验证获取token的时候,他默认跳转到你给定的登录页面
在这里插入图片描述

3.前端获取这个码传给后端,然后你根据你写的接口,返回给前端这个用户的所有信息和token
也就是直接进入展示页面,而不是登录页面

实现代码

type Code struct {
	AuthCode string `json:"authCode"`
}
func SweepLogin(code *models.Code) (list models.UserList, err error) {
	accessToken, err := GetAccessToken(code)
	var client *http.Client
	var request *http.Request
	var resp *http.Response
	var body []byte
	URL := "https://api.dingtalk.com/v1.0/contact/users/me"
	client = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	}, Timeout: time.Duration(time.Second * 5)}
	request, err = http.NewRequest("GET", URL, nil)
	if err != nil {
		return
	}
	// Set the header parameter
	request.Header.Set("x-acs-dingtalk-access-token", accessToken)
	request.Header.Set("Content-Type", "application/json")
	// Send the request
	resp, err = client.Do(request)
	if err != nil {
		// Handle error
	}
	defer resp.Body.Close()
	// Read the response body
	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		// Handle error
	}
	r := struct {
		AvatarURL string `json:"avatarUrl"`
		Mobile    string `json:"mobile"`
		Nick      string `json:"nick"`
		OpenID    string `json:"openId"`
		StateCode string `json:"stateCode"`
		UnionID   string `json:"unionId"`
	}{}
	//把请求到的结构反序列化到专门接受返回值的对象上面
	err = json.Unmarshal(body, &r)
	if err != nil {
		return
	}
	u := db.Table("user_lists").Where("unionid = ?", r.UnionID).Find(&user)
	if u.RowsAffected == 0 {
		// 用户不存在
		return list, ErrorUserNotExit
	}
	db.Table("user_lists").Where("unionid = ?", r.UnionID).Find(&list)
	return list, err
}

func GetAccessToken(code *models.Code) (accessToken string, err error) {
	var client *http.Client
	var request *http.Request
	var resp *http.Response
	var body []byte
	URL := "https://api.dingtalk.com/v1.0/oauth2/userAccessToken"
	client = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	}, Timeout: time.Duration(time.Second * 5)}
	//此处是post请求的请求题,我们先初始化一个对象
	b := struct {
		ClientID     string `json:"clientId"`
		ClientSecret string `json:"clientSecret"`
		Code         string `json:"code"`
		GrantType    string `json:"grantType"`
	}{
		ClientID:     "dingjfxu75nqiffmdbb8",
		ClientSecret: "X-ZVvfCTSl8qPWZEBI2VzJVQnkHoiikZ90gceJnZpIzhDGw5a3wFpXcy6Ce85c1x",
		Code:         code.AuthCode,
		GrantType:    "authorization_code",
	}
	//然后把结构体对象序列化一下
	bodymarshal, err := json.Marshal(&b)
	if err != nil {
		return
	}
	//再处理一下
	reqBody := strings.NewReader(string(bodymarshal))
	//然后就可以放入具体的request中的
	request, err = http.NewRequest(http.MethodPost, URL, reqBody)
	if err != nil {
		return
	}
	request.Header.Set("Content-Type", "application/json")
	resp, err = client.Do(request)
	if err != nil {
		return
	}
	defer resp.Body.Close()
	body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]
	if err != nil {
		return
	}
	r := struct {
		AccessToken  string `json:"accessToken"`
		Code         string `json:"code"`
		ExpireIn     int64  `json:"expireIn"`
		Message      string `json:"message"`
		RefreshToken string `json:"refreshToken"`
		Requestid    string `json:"requestid"`
	}{}
	//把请求到的结构反序列化到专门接受返回值的对象上面
	err = json.Unmarshal(body, &r)
	if err != nil {
		return
	}
	if r.Code != "" {
		return "", errors.New(r.Message)
	}
	return r.AccessToken, nil
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Vue 3 钉钉扫码登录,你可以按照以下步骤进行操作: 1. 在钉钉开放平台注册开发者账号,并创建一个应用,获取到 `AppKey` 和 `AppSecret`。 2. 在 Vue 3 项目中安装 `axios`,用于发送 HTTP 请求。可以使用以下命令安装: ``` npm install axios ``` 3. 创建一个登录组件,可以命名为 `Login.vue`,在该组件中包含一个用于展示钉钉扫码的部分。 4. 在 `Login.vue` 组件中,使用钉钉开放平台提供的前端 SDK 进行扫码登录。你可以在 `created` 钩子函数中调用 `dd.config` 方法进行配置,然后调用 `dd.scan` 方法进行扫码操作。 5. 当用户完成扫码并授权登录后,钉钉会回调一个临时授权码。 6. 在 Vue 3 中,你可以在 `Login.vue` 组件中使用 `axios` 发送一个 POST 请求,将临时授权码发送到后端服务器。 7. 后端服务器接收到临时授权码后,使用 `AppKey` 和 `AppSecret` 向钉钉开放平台发送请求,获取用户的持久授权码和用户信息。 8. 后端服务器将持久授权码和用户信息保存在数据库中,并生成一个用户标识(如用户 ID)返回给前端。 9. 前端收到用户标识后,可以将其保存在本地(如使用 `localStorage`),并跳转到其他页面。 请注意,上述步骤只是一个大致的流程,具体实现还需要根据你的项目结构和需求进行调整。同时,钉钉开放平台提供了详细的文档和示例代码,建议你参考这些资源进行开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值