OAuth 简介
OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全、开放的标准。 基于 OAuth 认证授权具有以下特点:- 安全。OAuth 与别的授权方式不同之处在于:OAuth 的授权不会使消费方(Consumer)触及到用户的帐号信息(如用户名与密码),也是是说,消费方无需使用用户的用户名与密码就可以申请获得该用户资源的授权。
- 开放。任何消费方都可以使用 OAuth 认证服务,任何服务提供方 (Service Provider) 都可以实现自身的 OAuth 认证服务。
- 简单。不管是消费方还是服务提供方,都很容易于理解与使用。
- 消费方与不同的服务提供方建立了关系。
- 消费方共享一个密码短语或者是公钥给服务提供方,服务提供方使用该公钥来确认消费方的身份。
- 消费方根据服务提供方将用户重定向到登录页面。
- 该用户登录后告诉服务提供方该消费方访问他的保护资源是没问题的。
OAuth 认证授权流程
在了解 OAuth 认证流程之前,我们先来了解一下 OAuth 协议的一些基本术语定义:- Consumer Key:消费方对于服务提供方的身份唯一标识。
- Consumer Secret:用来确认消费方对于 Consumer Key 的拥有关系。
- Request Token:获得用户授权的请求令牌,用于交换 Access Token。
- Access Token:用于获得用户在服务提供方的受保护资源。
- Token Secret:用来确认消费方对于令牌(Request Token 和 Access Token)的拥有关系。
- 消费方向 OAuth 服务提供方请求未授权的 Request Token。
- OAuth 服务提供方在验证了消费方的合法请求后,向其颁发未经用户授权的 Request Token 及其相对应的 Token Secret。
- 消费方使用得到的 Request Token,通过 URL 引导用户到服务提供方那里,这一步应该是浏览器的行为。接下来,用户可以通过输入在服务提供方的用户名 / 密码信息,授权该请求。一旦授权成功,转到下一步。
- 服务提供方通过 URL 引导用户重新回到消费方那里,这一步也是浏览器的行为。
- 在获得授权的 Request Token 后,消费方使用授权的 Request Token 从服务提供方那里换取 Access Token。
- OAuth 服务提供方同意消费方的请求,并向其颁发 Access Token 及其对应的 Token Secret。
- 消费方使用上一步返回的 Access Token 访问用户授权的资源。
- 第 1、实现三个 Service endpoints,即:提供用于获取未授权的 Request Token 服务地址,获取用户授权的 Request Token 服务地址,以及使用授权的 Request Token 换取 Access Token 的服务地址。
- 第 2、提供基于 Form 的用户认证,以便于用户可以登录服务提供方做出授权。
- 第 3、授权的管理,比如用户可以在任何时候撤销已经做出的授权。
- 第 1、从服务提供方获取 Customer Key/Customer Secret。
- 第 2、提供与服务提供方之间基于 HTTP 的通信机制,以换取相关的令牌。
图 3. 在 Plaxo 获得 GMail 联系人
图 4. 在 lab.madgex.com 获得 GMail 联系人
图 5. 登录 Google
图 6. Google 对 lab.madgex.com 网站授权
示例
准备工作
作为消费方,首先需要访问 https://www.google.com/accounts/ManageDomains,从 Google 那里获得标志我们身份的 Customer Key 及其 Customer Secret。另外,您可以生成自己的自签名 X509 数字证书,并且把证书上传给 Google,Google 将会使用证书的公钥来验证任何来自您的请求。 具体的操作步骤,请读者参考 Google 的说明文档:http://code.google.com/apis/gdata/articles/oauth.html。 在您完成这些工作,您将会得到 OAuth Consumer Key 及其 OAuth Consumer Secret,用于我们下面的开发工作。如何获得 OAuth Access Token
以下的代码是基于 Google Code 上提供的 OAuth Java 库进行开发的,读者可以从 http://oauth.googlecode.com/svn/code/java/core/ 下载获得。- 指定 Request Token URL,User Authorization URL,以及 Access Token URL,构造 OAuthServiceProvider 对象:
OAuthServiceProvider serviceProvider = new OAuthServiceProvider( "https://www.google.com/accounts/OAuthGetRequestToken", "https://www.google.com/accounts/OAuthAuthorizeToken", "https://www.google.com/accounts/OAuthGetAccessToken"); - 指定 Customer Key,Customer Secret 以及 OAuthServiceProvider,构造 OAuthConsumer 对象:
OAuthConsumer oauthConsumer = new OAuthConsumer(null , "www.example.com" , "hIsGkM T4 90fKNesTtJq8Gs" , serviceProvider); - 为 OAuthConsumer 指定签名方法,以及提供您自签名 X509 数字证书的 private key。
oauthConsumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.RSA_SHA1); oauthConsumer.setProperty(RSA_SHA1.PRIVATE_KEY, privateKey);
- 由 OAuthConsumer 对象生成相应的 OAuthAccessor 对象:
accessor = new OAuthAccessor(consumer);
- 指定您想要访问的 Google 服务,在这里我们使用的是 Calendar 服务:
Collection