对 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 ...
随机推荐
- ex_gcd求不定方程的最小正整数解
#include<bits/stdc++.h> using namespace std; int gcd(int a,int b) {return b?gcd(b,a%b):a;} int ...
- Java之路---Day14(内部类)
2019-10-29-23:08:00 目录 1.内部类 2.成员内部类 3.局部内部类 4.局部内部类的final问题 5.匿名内部类 内部类: what:内部类(nested classes),面 ...
- Java自学-数字与字符串 字符串转换
Java中把数字转换为字符串,字符串转换为数字 步骤 1 : 数字转字符串 方法1: 使用String类的静态方法valueOf 方法2: 先把基本类型装箱为对象,然后调用对象的toString pa ...
- dubbo循序渐进 - yml配置
Dubbo首先使用com.alibaba.dubbo.config.spring.schema.NamespaceHandler注册解析器,当spring解析xml配置文件时就会调用这些解析器生成对应 ...
- 计算n阶乘中尾部零的个数
大佬答案 大佬的思路看了好久,每次看都会明白一丢丢,现在还有不明白的地方,但是要往后继续加油了,知新温故. 结论:参与阶乘的所有数的因子中只要存在一个2和一个5就会在阶乘的结果中产生一个0. 又因为因 ...
- JavaScript 之 history对象
location.history 对象是浏览器的一个历史对象,可以用来前进和后退. 1.back() 方法 history.back(); 浏览器的历史记录会记录原来的地址,这个方法将会返回到上一页. ...
- Easy2game使用
每个独享IP服务器,开设3-5个高速接口IP,用户可自行选择当地连接速度快的接口接入服务器,服务器再为用户自动分配所绑定的独享IP连接至游戏服务器,可保证连接的稳定性,统一性 打开软件 添加程序 服务 ...
- Elasticsearch使用DateHistogram聚合
date_histogram是按照时间来构建集合(桶)Buckts的,当我们需要按照时间进行做一些数据统计的时候,就可以使用它来进行时间维度上构建指标分析. 在前面几篇中我们用到的hitogr ...
- Spark(火花)快速、通用的大数据处理引擎框架
一.什么是Spark(火花)? 是一种快速.通用处理大数据分析的框架引擎. 二.Spark的四大特性 1.快速:Spark内存上采用DAG(有向无环图)执行引擎非循环数据流和内存计算支持. 内存上比M ...
- centos安装redis并且加入开机启动
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_41114593/articl ...