印象中工作以来还从来没搞过一次 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 的一次尝试的更多相关文章

  1. (笔记)linux增加非标波特率的方法

    1.内核修改 涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h 在linux内核中,struct ktermios结构的 ...

  2. 一文带你了解 OAuth2 协议与 Spring Security OAuth2 集成!

    OAuth 2.0 允许第三方应用程序访问受限的HTTP资源的授权协议,像平常大家使用Github.Google账号来登陆其他系统时使用的就是 OAuth 2.0 授权框架,下图就是使用Github账 ...

  3. 【OAuth2.0】Spring Security OAuth2.0篇之初识

    不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...

  4. 各种非标232,485协议,自定义协议转modbus协议模块定制开发,各种流量计协议转modbus,

    工业现场经常会碰到通过485或者232采集各类仪表数据,但是很多早期的仪表和设备不支持标准modbus协议,而是采用自定义的协议,这些协议数据由plc或者dcs系统来实现采集,不仅费时麻烦,而且不方便 ...

  5. stm32实现DMX512协议发送与接收(非标)

    最近把玩了一下485,期间也接触了dmx512通信协议,该协议主要用于各种舞台灯光的控制当中,进而实现各种光效以及色彩变化.根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么 ...

  6. Oracle EBS-SQL (WIP-5):检查非标任务本身选上了MRP净值.sql

    SELECT WE.WIP_ENTITY_NAME,            MSI.SEGMENT1,            MSI.DESCRIPTION,            WDJ.CLASS ...

  7. Oracle EBS-SQL (WIP-3):检查非标任务子件没选MRP净值.sql

    SELECT WE.WIP_ENTITY_NAME,           MSI.SEGMENT1,           MSI.DESCRIPTION,           WDJ.CLASS_CO ...

  8. Oracle EBS-SQL (WIP-2):检查非标任务没挂自己本身.sql

    SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...

  9. Oracle EBS-SQL (WIP-1):检查非标任务没挂需求.sql

    SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...

随机推荐

  1. lazyload的使用方法

    http://blog.csdn.net/peidandan/article/details/8107634

  2. java 基础 四种权限修饰符

    /** * Java有四种权限修饰符: * public > protected > (default) > private * 同一个类 YES YES YES YES * 同一个 ...

  3. Linux中的defunct进程(僵尸进程)

    一.什么是defunct进程(僵尸进程)?在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态 ...

  4. ip2region.jar实现ip转地址

    ip转地址 根据ip地址查询出所在地址. GitHub地址 https://github.com/lionsoul2014/ip2region/ pom坐标 <dependency> &l ...

  5. js两个不同类型值比较Boolean(0=='')

    写js遇到的问题 本以为 Boolean(0=='') 结果为true 可是在控制台执行 Boolean(0==' ')trueBoolean(0==null)false 百度得知,两个不同类型值比较 ...

  6. 数据库-如何创建SQL Server身份验证用户

    1.简介 默认安装SQL Server数据库后,SQL Server通过工具SQL Server Management Studio(SSMS)采用“Windows身份验证”方式登录,需要设置相应用户 ...

  7. 原油PETROLAEUM英语PETROLAEUM石油

    petrolaeum (uncountable) Archaic spelling of petroleum petroleum See also: Petroleum Contents [hide] ...

  8. Python学习日记(四十二) Mysql数据库篇 十

    前言 当我们自己去写SQL代码的时候有时候会因为不熟练会导致效率低,再之后要进行许多的优化,并且操作也较为繁琐.因此ORM框架就能够解决上面的问题,它能根据自身的一些规则来帮助开发者去生成SQL代码. ...

  9. MAC PHP7 如何disable xdebug

    1. 查看xdebug当前状态是否是enable 打开terminal,输入: php -m | grep xdebug terminal返回xdebug,说明现在xdebug是enable状态. 2 ...

  10. Ubuntu中如何为wine程序创建快捷方式

    1.安装一个gnome组件及其应用 sudo apt-get install gnome-panel 2.运行以下命令弹出创建快捷方式的窗口 sudo gnome-desktop-item-edit ...