你可能并不需要 OAuth2

Feb 11, 2018 oauth

OAuth2 是一个关于 授权 (Authorization)的网络标准,在网上已经有大量的资料来解释,本文不再详细解释原理和规范的详情。关于 Authorization 和 Authentication 的区别之后会写另外一篇文章来分析。在此仅列两个比较优质的解释 OAuth2 原理的文章:

尽管如此,这里还是描述一下 OAuth2 的使用场景,以便约定和明确一下角色方便后面叙述。

角色

  • A (twitter): 托管内容、搭建 OAuth2 服务、提供第三方登录接入;
  • C: twitter 的用户,在 twitter 网站上产生内容;
  • B1 (medium.com): 希望 C 用 twitter 账号来登录自己的网站,并且希望获得 C 的 twitter 头像和用户名等基本信息;
  • B2 (buffer.com): 希望 C 用 twitter 账号登录 buffer.com 并编写内容然后直接发布到 twitter
  • B3 (twitterrific): twitter 的第三方 iOS 客户端

使用场景

用户 C 想要用自己的 twitter 的账号登录 medium.com,或者想用 buffer.com 来管理 twitter 的内容,或者想用 twitterrific 来刷推。但是这三个情况 用户 C 都不希望把自己的 twitter 用户名和密码直接交给 B,而是希望 twitter 和 B 之间通过某种协商,给 B 相应的权限。

需要多少权限是 B 在 twitter 的开放平台上设置的,是不是把这些权限(或者给部分权限)给 B 是用户 C 自己决定的,而且这个决定的操作(授权)是在 twitter 的网站或者官方 APP 里进行的。

在用户觉得某个 B 不值得信任的时候,在 twitter 的账号管理界面可以撤销对它的授权。或者当 twitter 发现某个 B 有违规操作的时候,可以完全禁止 B 获得授权。

OAuth2 就能满足以上的授权需求。

搭建 OAuth2 服务(担任 A)

什么时候需要自己搭建 OAuth2 服务呢?一般来说两种情况:

  • 作为 twitter、Facebook、微信、QQ 这种有完善的用户系统、在互联网占到了基础设施级别的用户量,开放给其他网站做社交媒体登录;
  • 作为 reddit 这种论坛网站,或者微博、twitter 这种社交媒体,开放给第三方开发客户端或者扩展应用。这种网站的特点是:本身是功能比较丰富,

接入 OAuth2 服务(担任 B)

什么时候需要接入别人提供的 OAuth2 服务呢?跟上面的担任 A 相对应的两种情况:

  • 自己的网站想要用户使用 twitter、Facebook、微信、QQ 来登录,让用户跳过繁琐的注册过程,提高转化率;
  • 想要为 reddit、微博、twitter 之类的网站开发客户端或者扩展应用。

不需要 OAuth2 的场景

总的来说,任何用来做 认证(Authentication)的场景都不适合用 OAuth,比如:

  • 只有一套用户系统的时候:用常规的用户名密码模式或者联合身份等就够了。
  • 有多套用户系统,但是这个数量是有限的而且是受控制的,比如同一家公司的几个子产品之间有不同的用户系统,但是希望能把这些用户打通:这就是典型的 Single Sign On 的应用场景。