对 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 ...
随机推荐
- Angular复习笔记7-路由(下)
Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...
- 这两个小技巧,让我的SQL语句不仅躲了坑,还提升了1000 倍
原文: https://cloud.tencent.com/developer/article/1465618 本次来讲解与 SQL 查询有关的两个小知识点,掌握这些知识点,能够让你避免踩坑以及提高查 ...
- Mybatis 映射器接口实现类的方式 运行过程debug分析
查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 <?xml version="1.0" encoding= ...
- cmd脚本
管道命令 | |命令的作用,就是让前一命令的输出当做后一命令的输入. > >会清除掉原有文件中的内容后把新的内容写入原文件: echo @echo off > a.bat. > ...
- 安装vivado 2016.1时出错
在将vivado 2016.1安装到d:\ xilinx时,发生以下错误: 提取存档D时遇到 错误:\ Xilinx_Vivado_SDK_2016.1_0409_1 \ payload \ rdi_ ...
- js计算得来的属性
计算得来的属性 如果需要使用表达式来创建属性键,那么需要使用方括号.否则属性名称不会进行计算: var obj = { 'b'+'ar': 'foo' }; // SyntaxError: missi ...
- uni-app悬浮框模板
1. uni-app悬浮框模板 1.1. 目标 模仿饿了吗app的悬浮框效果,即上移过程中,中间的某个组件框到顶部后不再上移,呈类似置顶的效果 1.2. 问题 中间遇到fixed固定组件导致flex失 ...
- Android-----File(文件各种操作)
在Android编程中,操作文件是基本的必备技能,现在做一个操作文件的小工具:DocumentTool.java 代码如下: package com.hs.example.exampleapplica ...
- iview 多选下拉列表选项回显问题
如,简单的多选Select, <Select v-model="model" filterable clearable transfer multiple > < ...
- jmeter 使用命令行执行
一般情况我们在设计脚本的时候,可以使用界面执行. 实际在压测的时候,我们可以使用命令行在后台执行. jmeter -n -t D:\document\bgy\jemeter\Script1.jmx - ...