[OAuth Series] Introduction to OAuth: An open authorization protocol in the Internet

OAuth,一个让人又爱又恨的验证协定,它让许多主流的社群网站与网络服务打开了封闭已久的验证大门,它也是在网络上公开个人或私人资讯 (private data) 前最主要的验证管道之一,重要的是,在这个协定下,所有公开给外界的私密数据会受到两个阶段的保护,OAuth 保障使用者可以在应用程序要求数据前由使用者做明确授权,只有授权过的资源才会开放给应用程序存参考,而且 OAuth 公开的特性,可以让应用程序在极少量程序的变更下,移植到不同的服务继续使用,而 OAuth 协定也让服务端精确的控制要开放的服务,并且提供使用者授权的管道以让使用者能自由控制授权与否,而且用户端应用程序只要利用 HTTP 协定即可使抈 OAuth 服务。


OAuth Logo

OAuth,一个让人又爱又恨的验证协定,它让许多主流的社群网站与网络服务打开了封闭已久的验证大门,它也是在网络上公开个人或私人资讯 (private data) 前最主要的验证管道之一,重要的是,在这个协定下,所有公开给外界的私密数据会受到两个阶段的保护,OAuth 保障使用者可以在应用程序要求数据前由使用者做明确授权,只有授权过的资源才会开放给应用程序存参考,而且 OAuth 公开的特性,可以让应用程序在极少量程序的变更下,移植到不同的服务继续使用,而 OAuth 协定也让服务端精确的控制要开放的服务,并且提供使用者授权的管道以让使用者能自由控制授权与否,而且用户端应用程序只要利用 HTTP 协定即可使用 OAuth 服务。那为什么我会说又爱又恨呢?因为它真的不容易使用,会让想使用它的开发人员头发被抓掉好几百根…。

OAuth 是 Open Authorization 的缩写,由 2006 年起草的新验证规格,当时产业界还有一些不同的协定,像是 Open ID,Shibboleth,WS-Federation 等协定,这些都被称为 Central Authentication Service (中央验证服务),只是这些协定使用上都不怎么容易,有些有明确的软件平台限制,有些则是要装某些套件等,OAuth 则是比较后期出现的服务,但它用起来简单,又相容于 HTTP 的标准,任何可以产生 HTTP 通讯方式的平台与函数库都可以使用,它也很常搭配 Open ID 使用,所以在一些大型网络服务平台 (ex: Google, Yahoo) 会看到 Open ID + OAuth 的格式,但 OAuth 本身也具备验证能力,不过它是由服务端来做验证。Open ID 亦不是本系列文的重点,所以我们只会在这系列文中看到 OAuth 的使用方式。

那 OAuth 是怎么运行的呢?虽然各大网站都有提供 OAuth 的操作流程,但基本上会是以下图的流程为准:


图来自:http://oauth.net/core/1.0/

大体上会分为三个进程:

  1. 用户端应用程序向服务要求一个 Request Token,这个 Token 会用来识别应用程序要求存取的工作阶段。
  2. 用户端应用程序开启浏览器 (Desktop Application) 或由服务导向到授权的网页 (Web Application),由使用者决定是否授权,若使用者决定授权时,用户端应用程序会得到一个 Verifier Token,这个 Token 会在稍后向服务要求存取权限。
  3. 用户端应用程序向服务提交 Request Token 与 Verifier Token,服务在验证过后核发 Access Token,这个 Token 会在应用程序每次向服务要求资源时,由用户端应用程序提交以验证权限。

那么服务是怎么样决定用户端使用的是 OAuth 协定时,其实很简单,是透过 HTTP Header 中的 Authorization 标头数据,应用程序在 HTTP 要求中加入 OAuth oauth…. 的资讯,服务会拆解这个标头中的 OAuth 数据进行检查以验证用户端的权限,例如下面的 HTTP Request 就是典型的 OAuth 调用:

POST /accounts/OAuthGetRequestToken HTTP/1.1
Host: www.google.com
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth
oauth_consumer_key="example.com",
oauth_signature_method="RSA-SHA1",
oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
oauth_timestamp="137131200",
oauth_nonce="4572616e48616d6d65724c61686176",
oauth_version="1.0"
oauth_callback="http://www.example.com/showcalendar.html"

整个 OAuth 最困难的部分就是去搞懂这些在 OAuth 中规定的参数,而这也是使用 OAuth 协定开发用户端应用程序的最大门槛,只要通过这个门槛后,之后的服务存取就变得十分简单。

我们在下一回中,来说明这些参数的意义以及用法。