涂鸦基于OAuth2在开发者平台上的探索与实践
前言
开发授权(OAuth2)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资料(如照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth2允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
理解OAuth2协议
- 资源所有者(resource owner)
- 客户端/第三方应用(client/App)
- 资源服务器(resource server)
- 授权服务器(authorization Server)
客户端应用程序必须首先向与资源服务器关联的授权服务器注册。这通常是一项一次性任务,一旦注册,除非客户申请注册撤销,否则注册仍然有效。在注册时,授权服务器为客户端应用程序分配了客户端ID和客户端密钥(密码)。客户端ID和密码对于该授权服务器上的客户端应用程序是唯一的。
典型流程
- 授权码模式(Authorization Code Grant)
授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
- 隐藏式(implicit)
有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。
- 密码式(Password Credentials Grant)
如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。
- 凭证式(Client Credentials Grant)
最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。
涂鸦主要授权
云开发平台 提供不同品类、不同通讯能力的设备以支持创客及厂商在各种家庭、商业和城市场景应用。云开发平台借助于涂鸦成熟的 IoT 服务,结合不同对接场景,提供了多种对接模式。
-
简单模式(隐式授权)
云开发平台提供了基于 OAuth 2.0 协议的对接方法。开发人员可以在涂鸦 AI+IoT 开发平台申请云 API,根据涂鸦 API 接口规范调用涂鸦 API,获取开发人员的用户和设备数据,并通过权限控制设备。说明:例如,开发人员可以在平台上将其涂鸦智能 App 用户账号扫码授权(或者创建 OEM 应用程序和产品),通过帐户获取用户数据或设备数据。
-
授权码模式(显式授权)开发期待中
在 云开发平台 应用云 API 密钥后,开发人员可以基于涂鸦 API 接口规范调用涂鸦开放接口,以获取授权下的资源数据。说明:授权码方式主要应用于没有在涂鸦 AI+IoT 开发平台中创建 OEM 应用的云集成场景。
OAuth2之涂鸦云开发平台
便捷的使用和操作
云开发平台是涂鸦打造的物联网云端开放平台,为各行业应用开发者、设备制造商、方案商提供了包含 OpenAPI 在内的各类云端服务,覆盖了设备控制、全屋管理、场景自动化等核心场景的通用能力,并整合了智慧安防、智慧商照、智慧社区、智慧酒店、智慧公寓等垂直领域的 PaaS 能力。基于云开发平台及配套技术服务,开发者可以围绕 Powered by Tuya 设备快速构建智慧城市、智慧商业、智慧工业等各行业解决方案。
在涂鸦云开发平台中,为了使用开发平台提供的API(应用程序接口),你需要先创建一个项目。云开发项目是IoT平台资源(设备、API权限、数据资产等)的集合,不同云开发项目之间的资源相互隔离。我们会给每一个项目一个专属的Client ID和Client Secret。
ID跟Secret的使用方式跟其他一些协议中的公钥私钥的方案相类似,你可以使用你所熟悉的编程语言将ID和secret结合,为你发出的每个请求添加签名,以此来向涂鸦开发平台表明自己身份的合法性。
涂鸦开发平台上的这些操作,对应上图的(1)、(2)、 (3)和(4)步骤,我们通过开发平台上的ID和Secret就可以拿到Access Token。
拿到Access Token之后,开发者可通过调用 API 的形式实现内部业务逻辑的开发。设备状态监听以消息队列的方式进行开放,以满足第三方开发者对设备状态的监听,用于实现不同设备间的联动。
丰富的资源和接口
配网管理
随着产品配网方式丰富度的提高,云开发平台对主流配网能力进行了迭代,提供了权限管理接口来满足不同配网方式的诉求,例如 Wi-Fi 配网、蓝牙配网、蓝牙 & Wi-Fi 双模配网等方式。
API 列表
请求方式 | API | 设备类型 | 接口说明 |
---|---|---|---|
POST | /v1.0/device/paring/token | 普通设备 | 生成配网令牌。 |
GET | /v1.0/device/paring/tokens/ | 普通设备 | 获取配网设备列表。 |
PUT | /v1.0/devices/{device_id}/enabled-sub-discovery | Zigbee 设备 | 开放网关允许子设备入网。 |
GET | /v1.0/devices/{device_id}/list-sub | Zigbee 设备 | 获取当前入网的子设备列表。 |
GET | /v1.0/devices/{device_id}/sub-devices | Zigbee 设备 | 获取网关下的子设备列表。 |
设备控制
获取设备控制相关的指令集、规格属性、最新状态,以及下发设备指令的接口。
请求方式 | API | 描述 |
---|---|---|
GET | /v1.0/functions/ | 按品类获取指令集 |
GET | /v1.0/devices/{device_id}/functions | 按设备获取指令集 |
GET | /v1.0/devices/{device_id}/specifications | 获取设备规格属性(包含指令集和状态集) |
POST | /v1.0/devices/{device_id}/commands | 下发设备指令 |
GET | /v1.0/devices/{device_id}/status | 获取设备最新状态 |
设备管理
...
大家可以注册涂鸦IoT平台,体验涂鸦基于OAuth2在开发者平台上的探索和实践,也感受下其给开发者留的众多丰富的接口!
引用和更多文章
(1) OAuth2.0的一个简单解释
(2) OAuth2.0的四种方式
(3) OAuth2.0 wiki文档
(4) 涂鸦云开发平台授权管理