写点什么

解密淘宝开放平台的认证授权机制(一)

2009 年 9 月 29 日

在所有的开放平台中,安全的问题都是平台和开发者要一起面对的一个难题,尤其是对于淘宝开放平台(TaoBao Open Platform,简称TOP)这样一个电子商务的开放平台来说,保护用户的隐私数据安全和平台本身的安全显得更为重要。同时考虑到平台的开放性,以及淘宝网这种上亿级别的访问量,这就给TOP 的安全机制带来了更大的挑战。

TOP 机制主要包含两个方面,一是业务的安全,包括认证、授权等;二是系统的安全,包含流量控制、系统监控等,这里主要讨论的是前者,业务的安全,也就是对于应用的认证和授权。

要让第三方开发的应用,通过 TOP 来获取用户的数据,必须经过用户和 TOP 的双重授权。在传统的平台中,如果第三方应用需要获取用户的相关数据,需要向第三方应用提供自己的用户名和 PIN 码,如下图:

例如,在不少的 SNS 网站上,如果要获取用户的 MSN 好友信息,需要用户把自己的用户名和 PIN 码提交给这些 SNS 网站,SNS 网站作为用户的代理,向 MSN 服务端发送请求来获取用户的好友信息。虽然这些 SNS 网站一再声称不会保存用户的 PIN 码,但这种方式,天然是有着安全缺陷的。

而在各大互联网公司推出的开放平台中,上面的三角关系变成了下面这种:

用户首先在平台进行登录认证,认证通过之后,平台会颁发给用户一个 Token,用户将这个 Token 授权给第三方应用之后,第三方应用就可以使用这个 Token 来向平台获取用户的相关数据了。目前 OAuth、Facebook Connect、Flickr Auth,包括 TOP 也都是使用的这种方式。

在 TOP 中,一个第三方应用如果要获取用户数据,是需要两方面的授权的:

  • 来自 TOP 的授权 在开发者向 TOP 申请开发一个应用的时候,TOP 会对开发者的资质进行审查,应用要申请的权限越高,对与开发者的资质要求就越高。在 TOP 中,每个应用(Application)都会对应一个或多个角色。例如对于交易类的 API,TOP 分为买家应用、卖家应用、商家应用、高级应用、专业应用等角色,普通的开发者能够比较容易的申请到买家应用和卖家应用的角色,这两种角色已经能够满足绝大多数的需要,而对于商家应用、高级应用、专业应用,则需要相对比较高的资质要求。

    如果开发者声明应用只是自己使用的,就比较容易申请到比较高的权限,这样,开发者申请到的 Application 就只能通过 API 访问开发者自己的隐私数据,是无法获取其他人的隐私数据的。

  • 来自用户的授权 在 TOP 开放的 OpenAPI 中,API 分为三类:一是公开查询类的 API,例如查询淘宝类目信息,这些 API 是不需要用户授权即可调用的;二是隐私类 API,例如上传商品,这些 API 必须要获得用户的授权才可以调用;还有一类 API,既包含用户隐私信息,又包含用户公开信息,例如查询用户信息这个 API,如果只是获取用户的公开信息字段,包括 nick、注册时间等,就不需要用户授权,而一旦要查询用户的隐私信息字段,如收货地址等,就必须获得用户的授权。

    用户授权的过程就如前面所讲的,用户从 TOP 获取到 Token,然后将 Token 授予第三方应用,应用使用这个 Token 就能够调用隐私类的 API 了。这个 Token 绑定了两个方面的信息,一是用户,即使用这个 Token 只能访问被绑定用户的隐私信息,不能访问其他用户的隐私信息;二是应用,即这个 Token 只能被绑定的应用所使用,不能被其他的应用使用。这样就能保证只有真正被用户授权的应用,才能访问这个用户的隐私信息。

    当然,这个 Token 是有有效期的,Token 的有效期也分为这样几类:

    1)根据访问进行延迟的 Token,类似于 Session,每次应用使用这个 Token 访问一次 OpenAPI,TOP 就会将这个 Token 的有效期延迟一个固定的时间;

    2)固定时限的 Token,由用户指定一个固定的过期时间,这个 Token 只能在这个有效的期限内使用;
    3)一次性的 Token,使用一次即失效的 Token,即授权一次,就只能使用一次;
    4)通知失效 Token,授权之后就能一直使用的 Token,直到用户通知这个 Token 失效。

对于如何获得用户的 Token,一直是开发者关注的焦点。在 TOP 中,提供了两种获取用户 Token 的方式:

  • URL 回调方式,对于 Web 类的应用,TOP 会要求开发者提供一个回调 URL。用户在 TOP 发起访问指定第三方应用的请求,TOP 验证用户是否已经登录,如果已经登录,则会给出一个提示性页面,告诉用户要访问的应用信息,以及可能的风险,如果用户确认继续访问,TOP 会通过这个回调 URL 将当前的上下文信息,以及用户的 Token 传递给应用,当然,传递给应用的信息中还包含一个 TOP 的签名信息,对于开发者,也有保护用户隐私信息的义务,所以开发者需要对这个签名信息进行验证,否则应用是不能通过 TOP 的上线审核的。
  • 授权码方式,对于这种方式,存在比较多的争议,其原因是需要用户手工复制粘贴一个授权码到应用中。但是对于桌面端应用,这种方式则显得非常必要,因为用户要使用的是桌面端应用,但是唯一能够信任的淘宝登录方式,是一个网页,只能在浏览器窗口中打开,所以必须要用户从浏览器窗口获取到授权码,然后粘贴到桌面端应用中,应用得到这个授权码之后,会向 TOP 请求当前的上下文以及用户的 Token 和 TOP 的签名,这些参数的格式,和前面 URL 回调方式获得的参数的格式是一致的。

应用获取到 Token 之后,就能够通过 OpenAPI 获取相关的数据了。而在整个过程中,用户并没有把自己的口令暴露给第三方的应用,应用就能获取到用户的授权访问用户隐私数据。是不是皆大欢喜呢?

当然不是,对于某些关键操作,例如交易付款,TOP 并没有提供相应的 API,而是提供了交易付款页面,将这种页面以服务的形式提供给第三方来使用,对于这类的服务,安全性要求更高,TOP 是怎么解决的呢?且听下回分解。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009 年 9 月 29 日 06:2116159

评论

发布
暂无评论
发现更多内容

轻松云上揽胜中华,靠的就是这份聪明的“地图”!

华为云开发者社区

MySQL 数据库 postgresql AI 地图

阿里P8架构师“墙裂”推荐:Java程序员必读的架构进阶热门书籍,值得学习!

Java成神之路

Java 程序员 架构 面试 编程语言

【涂鸦物联网足迹】涂鸦云平台接口列表

IoT云工坊

人工智能 接口 物联网 API 智能家居

美国区块链政策大盘点

CECBC区块链专委会

区块链 政策 货币

作为一名Java程序员,技术栈的广度深度都不够还想要高薪?请先把这些技术掌握再说。

Java成神之路

Java 程序员 架构 面试 编程语言

Github标星67.9k的微服务架构以及架构设计模式笔记我真的爱了

Java架构之路

Java 程序员 架构 面试 编程语言

多线程并发主题-ThreadLocalRandom类

Geek_896619

Java 并发编程 线程

阿里大牛说:你凭什么搞不懂SpringBoot,Cloud,Nginx与Docker

小Q

Java 学习 编程 架构 面试

握草!美团P8整理的280页超详细Docker实战文档简直太香了,让你对如日中天的Docker有更深入的了解。

Java架构之路

Java 程序员 架构 面试 编程语言

亲测三遍!8步搭建一个属于自己的网站

华为云开发者社区

MySQL Linux 开发者 网站 华为云

C++多元组tuple使用方法?你熟悉吗?快来看看吧

良知犹存

c++

WE大会上,科学家们是怎样治愈“小破球”的?

脑极体

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,双指针,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

手把手教你本地 k8s 集群搭建云原生 Tekton CICD 流水线

比伯

Java 大数据 编程 架构 计算机

微众银行大数据平台建设方案

康月牙Rita

大数据 开源 金融 平台 微众银行

Flutter Bloc模式

码爷

flutter ios 程序员

为什么我就面试阿里P6,好不容易过2面,3面来个架构师来吊打我?

小Q

Java 学习 程序员 架构 面试

《迅雷链精品课》第三课:区块链主流框架分析

迅雷链

区块链 区块链方案 区块链+ 区块链应用

企业级软件的核心价值

Philips

敏捷开发 企业应用

DeFi质押挖矿系统开发技术

薇電13242772558

区块链 defi

“双11”购物狂欢节,所有女生走进了谁的直播间?

BonreeAPM

APM AIOPS 拨测 直播 用户体验

高交会科技盛宴:“科技改变生活,创新驱动发展”

13530558032

什么?还不懂c++vector的用法,你凭什么勇气来的!

良知犹存

c++

IMC总决赛精彩对战应接不暇,英特尔酷睿极致性能燃爆比赛现场!

intel001

一位Java大牛结合自己的业务和平台多年来在Netty实践中积累的经验总结《Netty进阶之路:跟着案例学Netty》。

Java成神之路

Java 程序员 架构 面试 编程语言

Teambition 网盘 VS 阿里云盘:阿里这个浓眉大眼的也开始玩赛马了?

郭旭东

阿里云 阿里云网盘

mongodb 源码实现系列 - 网络传输层模块实现四

杨亚洲(专注mongodb及高性能中间件)

MySQL 数据库 mongodb 高性能 分布式数据库mongodb

java-File对象

Isuodut

云图说|多模态AI开发套件HiLens Kit:超强算力彰显云上实力

华为云开发者社区

人工智能 开发者 物联网 机器人 华为云

【Mycat】作为Mycat核心开发者,怎能不来一波Mycat系列文章?

冰河

分布式事务 分布式数据库 系统架构 分布式存储 mycat

AliP9整理出微服务笔记:Spring微服务不止架构和设计

周老师

Java 编程 程序员 架构 面试

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

解密淘宝开放平台的认证授权机制(一)-InfoQ