OAUTH之 钉钉第三方授权登录
文章目录
- OAUTH之钉钉第三方授权登录
- 前期用到的工具
- 获取access_token
- 请求地址
- 请求方法
- 响应
- 扫码 / 使用账号密码 -- 获取 临时 code
- 参数重要说明
- 直接访问 扫码登录
- 使用账号密码登录第三方网站
- 根据 sns 临时授权码获取用户信息
- 前置条件
- 请求地址
- 响应
- golang 具体操作和逻辑
- 根据 unionid 获取用户 userid
- 请求地址
- 请求方法
- 根据userid 获取 用户详情
- 请求地址
- 请求方法
- 获取部门列表
- 请求地址
- 请求方法
- 响应
- 获取部门用户 userid 列表
- 请求地址
- 请求方法
- 响应
OAUTH之钉钉第三方授权登录
hello,我是小魔童哪吒,欢迎点击关注,有更新,将第一时间呈现到你的面前
胖sir:小魔童,我今天收到了一个需求,期望我们做一个第三方登录的功能,用户可以通过第三方授权来登录我们的web
小魔童:啊哈?你有眉目吗
胖sir:那当然,我知道可以通过微信登录,钉钉登录,github登录等等呢
小魔童:那你知道都是咋实现的吗?说给我听听,让我也学一下
胖sir:你带我跑飞车吗?
小魔童:这。。 你。。 我教你如何一骑绝尘把,前提是你给我讲明白咋弄
胖sir:稳了,成交。
其实这种第三方登录的原理属于OAuth机制,主要用来颁发令牌(token),现在OAuth已经到 OAuth2.0了
用百度百科的话说:
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749 [1] 。
主要有如下四种方式,简单给你列举一下:
- 授权码
- 隐藏式
- 密码式
- 客户端凭证
画一个简图来你感受一下
当然我不是给你说OAuth自身的原理和涉及的技术,我是要来直接给你说咱们咋实现我刚才说的对接钉钉的接口,因为钉钉的开发文档中间有修改过好几次,
另外文档中的表述也存在晦涩难懂的地方,鉴于你带我飞车 一骑绝尘,我就给你说说 如何获取到钉钉的授权,以及拿到使用钉钉对应公司(必须有公司管理员的权限)下的组织结构
钉钉开发文档没有golang版本的SDK和源码,那么我们就自己来实现
前期用到的工具
- postman 做接口调试
- golang 语言 通过 goland 编译器 做
通过 access_token 和 临时 code 获取 unionid
的功能
获取access_token
请求地址
https://oapi.dingtalk.com/gettoken?appkey=xxx&appsecret=xxx
请求方法
- GET
- query
- appkey
- appsecret
此处的 appkey
和 appsecret
是H5微应用里面的应用数据
响应
{"errcode": 0,"access_token": "4dbda4ddb82dxxxxxx138afab15655","errmsg": "ok","expires_in": 7200
}
扫码 / 使用账号密码 – 获取 临时 code
参数重要说明
appId
登录应用的 appId
redirect_uri - 回调域名
重定向的url地址,登录成功后,网页会重定向到redirect_uri
redirect_uri 必须要在钉钉开放平台配置好,否则会没有权限访问如下地址 ,例如该参数填百度的地址
LOGO地址
自己在网络上的一张可以访问的图片地址即可,如下:
直接访问 扫码登录
https://oapi.dingtalk.com/connect/qrconnect?appid=xxxx&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=https://www.baidu.com/
使用账号密码登录第三方网站
https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=xxx&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=https://www.baidu.com/
如上2种方式登录成功后,是如下效果,暂时我们使用跳转的域名为https://www.baidu.com/
主要是为了获取 临时code
根据 sns 临时授权码获取用户信息
通过 access_token 和 临时code 获取unionid
前置条件
- 需要在钉钉开放平台上设置自己的服务器的出口ip白名单
请求地址
https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=xxx×tamp=xxx&accessKey=xxx
POST
query
accessKey
钉钉开放平台中,登录应用的 appId
timestamp
单位: 毫秒
signature
签名算法为HmacSHA256,签名数据是当前时间戳timestamp,密钥是appId对应的appSecret,使用密钥对timestamp计算签名值。
发送HTTP请求时需要把signature进行urlEncode,如果您使用的是HTTP封装方法,请确保不要重复urlEncode
body
{"tmp_auth_code":"4a2c5695b78738d495f47bxxxxxx"
}
响应
{"errcode":0,"user_info":{"nick":"名字","unionid":"dingdkjjojoixxxx","openid":"dingsdsqwlklklxxxx","main_org_auth_high_level":true},"errmsg":"ok"
}
golang 具体操作和逻辑
对于这个接口的签名计算方式,需要给你看看是如何实现的,具体实现很简单,但是对于时间戳的取值,需要注意是毫秒级别的
package mainimport ("bytes""crypto/hmac""crypto/sha256""crypto/tls""encoding/base64""encoding/json""fmt""io/ioutil""net/http""net/url""time"
)func main() {// 登录应用的 appSecretsecret := "xxxx"key := []byte(secret)h := hmac.New(sha256.New, key)timestamp := time.Now().UnixNano()/1e6 + 120000 //因为我的环境时间比钉钉服务器慢2分钟,所以我这里加了2分钟strTimeStamp := fmt.Sprintf("%d", timestamp)h.Write([]byte(strTimeStamp))sha := h.Sum(nil)sig := base64.StdEncoding.EncodeToString(sha)mysig := url.QueryEscape(sig)url := fmt.Sprintf("https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=%s×tamp=%d&accessKey=%s",mysig, timestamp, "xxxx")fmt.Println(url)tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},}spaceClient := http.Client{Timeout: time.Second * time.Duration(5), Transport: tr}m := map[string]string{"tmp_auth_code": "67d86cb135ee3bd18d756c2d2fa1a350"}res, err := json.Marshal(m)if err != nil {fmt.Println(res)return}fmt.Println(string(res))req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(res))req.Header.Set("Content-Type", "application/json")rawResp, err := spaceClient.Do(req)if err != nil {fmt.Println(rawResp)return}if rawResp.Status != "200 OK" {fmt.Println("rawResp.Status != 200 ok", rawResp)return}body, readErr := ioutil.ReadAll(rawResp.Body)if readErr != nil {fmt.Println("ReadAll error ", readErr)return}fmt.Println("result --", string(body))
}
根据 unionid 获取用户 userid
请求地址
https://oapi.dingtalk.com/topapi/user/getbyunionid?access_token=xxxxxx
请求方法
POST
query
- access_token
body 请求
{"unionid":"xxxxxx"
}
响应
{"errcode": 0,"errmsg": "ok","result": {"contact_type": 0,"userid": "managerxxxx"},"request_id": "xxxxxx"
}
根据userid 获取 用户详情
请求地址
https://oapi.dingtalk.com/topapi/v2/user/get?access_token=xxxxx
请求方法
- POST
- query
- access_token
- body 请求
{"language":"zh_CN","userid":"managerxxxxx"
}
响应
{"errcode": 0,"errmsg": "ok","result": {"active": true,"admin": true,"avatar": "","boss": false,"dept_id_list": [1],"dept_order_list": [{"dept_id": 1,"order": 176299320823645512}],"email": "","exclusive_account": false,"hide_mobile": false,"leader_in_dept": [{"dept_id": 1,"leader": false}],"mobile": "xxxxx","name": "xxx","real_authed": true,"role_list": [{"group_name": "默认","id": 1993003008,"name": "主管理员"}],"senior": false,"state_code": "86","unionid": "xxxxx","userid": "managerxxxxx"},"request_id": "xxxxx"
}
获取部门列表
请求地址
https://oapi.dingtalk.com/topapi/v2/department/listsub?access_token=xxxxx
请求方法
- POST
- query
- access_token
- body请求
{"language":"zh_CN","dept_id":1
}
响应
{"errcode": 0,"errmsg": "ok","result": [{"auto_add_user": true,"create_dept_group": true,"dept_id": 477856721,"name": "运营部","parent_id": 1},{"auto_add_user": true,"create_dept_group": true,"dept_id": 477856722,"name": "设计部","parent_id": 1}],"request_id": "evcmse04h8op"
}
获取部门用户 userid 列表
请求地址
https://oapi.dingtalk.com/topapi/user/listid?access_token=xxxxxx
请求方法
- POST
- query
- access_token
- body 请求
{"dept_id":xx
}
响应
{"errcode": 0,"errmsg": "ok","result": {"userid_list": ["managerxxxxx"]},"request_id": "xxxxx"
}
好了,本期就到这里了,要是对你还有点作用的话,还请帮忙点赞,评论,要是能够点个关注 或 转发到你的朋友圈,这将是对我最大的鼓励
技术是开放的,我们的心态更应如此,我们拥抱变化,心向阳光,坚定不移的实践我们的每一个想法。
作者:小魔童哪吒
OAUTH之 钉钉第三方授权登录相关推荐
- Spring security 集成 JustAuth 实现第三方授权登录
Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...
- 微信第三方授权登录之oauth开发
背景: 首先copy下别人讲解的oauth2.0验证授权的一些背景知识: 1) 传统的注册登陆方式: 如果你是一个新用户,则点击新用户注册按钮,进入由简书提供的注册页面,进行用户名密码验证和设置 然后 ...
- (二十二)admin-boot项目之集成just-auth实现第三方授权登录
(二十二)集成just-auth实现第三方授权登录 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础 ...
- 有了这个开源项目,让你分分钟搞定第三方授权登录
第三方登录授权对于很多开发者来说是很烦人的一件事,每个平台都要获得各自的权限,实践起来非常麻烦.今天 Gitee 给大家推荐的这款开源项目就是针对这个痛点所开发,一次性集成了十多家国内外常用的第三方平 ...
- Springboot基于justAuth实现第三方授权登录
1. 简介 随着科技时代日渐繁荣,越来越多的应用融入我们的生活.不同的应用系统不同的用户密码,造成了极差的用户体验.要是能使用常见的应用账号实现全应用的认证登录,将会更加促进应用产品的推广,为生活增加 ...
- aspnet登录界面代码_SPA+.NET Core3.1 GitHub第三方授权登录
GitHub第三方授权登录 有许多文章都讲过GitHub第三方授权登录,但就是没有.NET Core配合前后端分离的项目(Vue,React)的实践.所以本文以前后端分离项目中如何在授权登录后,生成T ...
- android 微博 4.1sdk,android使用新浪微博最新SDK4.1进行第三方授权登录
android使用新浪微博最新SDK进行第三方授权登录 工具:android-studio 新浪SDK版本:4.1 1Demo参考 下载官方SDK:https://github.com/sinawei ...
- 实现 Google 第三方授权登录
最近做项目要实现Google的第三方登录,这简单的记录一下. 目前Google的第三方登录有很多方案,且官方提供SDK方便接入.但是我这个项目同时要实现网页和客户端.所以选择了 Google OAut ...
- 基于 Oauth 2.0 的第三方账号登录实现
基于 Oauth 2.0 的第三方账号登录实现 Oauth 2.0 原理与授权流程 1.刚开始的第三方应用接入其他账号登录过程: 存在问题: 1.用户账号.密码信息透露给了第三方应用,导致安全问题 ...
最新文章
- c# 读取excel的一系列问题
- react与jQuery对比,有空的时候再翻译一下
- 虚拟机及VmBasic编译引擎实现
- python websocket server_Python Websocket服务端
- 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
- mysql中建立text_mysql中text
- 边缘计算:万物互联时代新型计算模型
- ajax同步获得数据字典的值,使用ajax加载数据字典,生成select(示例代码)
- 因为不想「被绿」,美国年轻人只想和 iPhone 聊天
- 整理一个双向链表list.h
- python 对任意文件(jpg,png,mp3,mp4)base64的编码解码
- vue中使用kindeditor编辑器_vue集成kindeditor富文本
- MCU升级文件HEX、BIN、S19格式概述
- Stata:各类盈余管理指标Stata实现方法
- 微信公众号数据2019_2019年微信公众号文章数据报告
- N1-AI生成挑战赛#你想不到的猫,快来为你喜欢的作品投票吧!
- 干货转发,【CDN市场洗牌悄然开始,行业黑马云帆加速又获金榜题名】
- C语言外挂实战【转】
- 上市首日24小时销量1573辆,这个被马云和雷军同时看上的男人
- linux MQ 比较全面的操作命令
热门文章
- 14-射频校准的原理和设置
- android studio 打包cocos creator项目
- 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)
- 小蓝本 第一本 《因式分解技巧》 第七章 综合运用 笔记 (第七天)
- (SSM解析错误)$%7BpageContext.request.contextPath%7D/account/save
- 从端到云——工业物联网项目全栈快速开发
- 正态分布 密度函数与分布函数
- 身份认证技术的产业发展
- R可视化ggplot2绘制多子图
- 全国计算机四级之网络工程师知识点(四)