印象中工作以来还从来没搞过一次 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. Eclipse集成Git做团队开发:代码管理

    在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...

  2. Mybatis 复习

    概述 mybatis 是一个用java编写的持久层框架, 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程,它使用了ORM思想实现了结果 集的封 ...

  3. Java自学-面向对象 属性

    Java类的属性 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 步骤 1 : 属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以是类类型,比如Strin ...

  4. 【转】用Python做股市量化策略投资数据分析

    金融量化分析介绍     本文摘要; 金融量化分析介绍 1.什么是金融量化分析 2.金融量化分析可以干什么 3.为什么将python运用于金融 4.常用库简介 1.什么是金融量化分析 从标题中我们可以 ...

  5. mmap vs read

    先放个结论: 内存映射通常比随机访问更快,尤其访问的对象是分离的和不可预测的. 内存映射会持续占用pages, 直到完成访问. 这意味当长时间重度使用一个文件很久之前, 然后你关闭了它, 然后再重新打 ...

  6. 阿里熔断限流Sentinel研究

    1. 阿里熔断限流Sentinel研究 1.1. 功能特点 丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围).消息削峰填谷.集群流量控制.实时熔断下游不可用应用等 完备的实时监控:S ...

  7. 从 Vue 的视角学 React(四)—— 组件传参

    组件化开发的时候,参数传递是非常关键的环节 哪些参数放在组件内部管理,哪些参数由父组件传入,哪些状态需要反馈给父组件,都需要在设计组件的时候想清楚 但实现这些交互的基础,是明白组件之间参数传递的方式, ...

  8. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

  9. python 读写excel(xls格式)

    import xlrd #导入模块 from xlutils.copy import copy #导入copy模块 rb = xlrd.open_workbook(r"e:\额度导入表.xl ...

  10. JVM垃圾收集算法之清除算法

    最近看了一些大佬的博文,文中提到说:学习知识不能一味的死学滥学,在学之前要明白为什么要学这个知识,在实际的应用中怎么运用这个知识.我觉得说的很对,很多时候我学习确实是了解了这是什么原理,但是要说到实际 ...