对 OAuth2 和非标 DingDing OAuth2 的一次尝试
印象中工作以来还从来没搞过一次 OAuth2 的接入- -,似乎只停留在愉快的使用阶段。比如现在很多网站都接了 wx 二维码扫码登录或者微博登录。所以一直只是享受着这样的便利,却没有机会自己来搞一搞把里面的技术细节打通。
首先找到 阮一峰老师的一篇古老的文章介绍了一下 OAuth 协议。
归根到底 OAuth 要做的事情就是在没有完整用户用户密码的情况下,通过用户授权访问第三方原本提供给用户的服务。
比如我要去上知乎,但是我不想注册一个知乎的账号,通过 OAuth 我可以通过微博的账号去访问知乎,但是注意这里有一点不太一样,就是当你这么做的时候,通常第三方服务商都会将你 OAuth 的账号和他们平台上的自动创建的账号进行绑定,这样能对你的身份进行确认。这是现在最广泛的用法,还有一种就是只通过你的授权去访问第三方的有限的服务。
RFC 6749 标准 OAuth2 流程如下:

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
通常流程 B 有很多种实现的方法,我这里看了好几家的文档 最常用的应该是授权码模式。
可能因为授权码是最完整,流程最严密的授权模式。它的特点就是通过客户端的后台服务器与服务提供商的认证服务器进行互动。

(A)用户访问客户端,后者将前者导向认证服务器。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
一个标准的协议在 A 步骤中包含了
response_type:上面谈到的授权类型,由于是授权码所以这里是 "code"
client_id: 标示客户端的应用id
redirect_uri:验证通过之后需要重定向到的 URI 通常会进行 url encode
scope:表示申请权限的范围。
一个拼好的正常的 url 可能会长这样
https://oapi.ggsimida.com/connect/qrconnect?client_id=xxx&response_type=code&scope=snsapi_login&
state=STATE&redirect_uri=http%3A//uisensor.hundun.cn/dashboard/
通常访问该地址之后我们会被带到第三方授权公司的认证服务器,要求用户进行授权。用户通过 qrcode 或者账号密码登录进行授权之后,会重定向到上面的 redirect_uri 填写的地址并且带上第三方应用发放的 state 和 授权权码。
这个时候就到了 D 步骤,D 步骤通过这个授权码,并附上重定向 URI 像第三方服务器的鉴权系统申请临时访问令牌,然后认证服务器核对信息之后发放 ac令牌和 rr更新令牌,到此便完成了认证。
这里要多说一句的是,dingding 的文档上好像并不是提供的标准 OAuth2 协议,虽然看上去很像但是并不是标准的。包括上面 A 步骤的链接里,dingding 需求一个叫 appId 的东西来替代 client_id ,并且当我们获得授权码之后,便无需再请求 token ,而是直接使用授权码+应用id+应用密钥当作身份就可直接通过接口认证请求用户信息了。
如果使用的服务是只支持标准的 OAuth2 协议的话,似乎无法无缝切换 dingding 的这个服务。
但是总有解决办法,我的选择是通过后端服务器包一层,将整个 OAuth2 的标准流程方在包装层,然后由包装层和 dingding 服务器进行交互,这样也能实现。
Reference:
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3 dingding 二维码登录文档
https://www.sensorsdata.cn/_manual/oauth_client.html sensors 标准 OAuth 文档
对 OAuth2 和非标 DingDing OAuth2 的一次尝试的更多相关文章
- (笔记)linux增加非标波特率的方法
1.内核修改 涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h 在linux内核中,struct ktermios结构的 ...
- 一文带你了解 OAuth2 协议与 Spring Security OAuth2 集成!
OAuth 2.0 允许第三方应用程序访问受限的HTTP资源的授权协议,像平常大家使用Github.Google账号来登陆其他系统时使用的就是 OAuth 2.0 授权框架,下图就是使用Github账 ...
- 【OAuth2.0】Spring Security OAuth2.0篇之初识
不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...
- 各种非标232,485协议,自定义协议转modbus协议模块定制开发,各种流量计协议转modbus,
工业现场经常会碰到通过485或者232采集各类仪表数据,但是很多早期的仪表和设备不支持标准modbus协议,而是采用自定义的协议,这些协议数据由plc或者dcs系统来实现采集,不仅费时麻烦,而且不方便 ...
- stm32实现DMX512协议发送与接收(非标)
最近把玩了一下485,期间也接触了dmx512通信协议,该协议主要用于各种舞台灯光的控制当中,进而实现各种光效以及色彩变化.根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么 ...
- Oracle EBS-SQL (WIP-5):检查非标任务本身选上了MRP净值.sql
SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS ...
- Oracle EBS-SQL (WIP-3):检查非标任务子件没选MRP净值.sql
SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CO ...
- Oracle EBS-SQL (WIP-2):检查非标任务没挂自己本身.sql
SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...
- Oracle EBS-SQL (WIP-1):检查非标任务没挂需求.sql
SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...
随机推荐
- JqGrid参考实例
<div class="gridtable mt5"> <table id="tbList"></table> <di ...
- U9-ERP BuildupDesigner 操作
它的数据库文件配制 D:\UFIDA\UBFV50\U9.VOB.Product.UBF\UBFStudio\Runtime\environment.xml
- APS.NET MVC + EF (08)---数据注解和验证
对于Web开发人员来说,用户输入验证一直是一个挑战.不仅在客户端浏览器中需要执行验证逻辑,在服务器端也需要执行.如果觉得验证是令人望而生畏的繁杂琐事,ASP.NET MVC框架提供了数据注解的方式帮助 ...
- 【转】 python_控制台输出带颜色的文字方法
在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...
- 有关MFC类与其窗口句柄
Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄.这就是Attach主要完成的任务. Detach.如前所述,WNDCLASS其实和CWnd根本没有什么关系.它们之间只是通过CW ...
- JS面向对象设计-理解对象
不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念, 它把对象定义为"无序属性(基本值.对象.函数)的集合",类似于散列表. 每 ...
- axios + vue导出excel文件
(使用到了elementUI框架) <template> <el-button type="primary" size="mini" @cli ...
- vue数组更新界面无变化
1. vue数组更新界面无变化 1.1. 说明 对数组进行更新或者添加,一定要注意方式,我的情况是数组套数组,双重循环,在造数据的时候,不断从尾部添加数据,所以写成了如下形式,每次下拉都会去加载一批相 ...
- 面试常问的join
少壮不努力,老大徒伤悲 工作大半辈子了,来到个陌生的过度,从零开始,像个应届毕业生一样投入茫茫人才市场,碰的满头包. 凡是涉及到sql server的都会问,join的问题,不烦记录下: SQL的jo ...
- 自己开发SSO单点登录
概述 单点登录指的是有一个中央的单点登录服务器,各个子系统和这个中央的单点登录服务器打交道,比如有A,B两个子系统. A登录后,B系统就不用再登录,直接可以访问,当其中有一个子系统选择注销时,那么所有 ...