OAuth 协议是现在众多网站提供API服务所选择的认证方式,是由Blaine Cook、Chris Messina、Larry Halff 及David Recordon共同发起,目的是为API服务提供一个安全、统一和开放的标准。
官方网站对 OAuth 的一句话介绍是:
An open protocol to allow secure API authentication in a simple and standard method from desktop and web applications.
大概意思是说 OAuth 是一种开放的协议,为桌面程序或者基于BS的web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。OAUTH认证授权具有以下特点:
1. 简单:不管是 OAuth 服务提供者还是应用开发者,都很容易于理解与使用;
2. 安全:没有涉及到用户密钥等信息,更安全更灵活;
3. 开放:任何服务提供商都可以实现 OAuth ,任何软件开发商都可以使用 OAuth;
OAUTH认证授权流程:
下面这个图就是演示了认证流程。这个图来自: http://wiki.opensocial.org/index.php?title=OAuth_Use_Cases
上述5个步骤解释如下:
- A user wishes to use their social network data inside of a third party website or application. The application server contacts the social network, but does not have the user's account information, and does not have permission to access the user's data.
用户希望在第三网站和应用上使用他在SNS网站上的用户信息,这些第三方网站联系SNS网站,但是由于没有用户认证信息,这时这些用户信息是不允许访问的。
更技术点说法:
第三方应用程序向SNS网站授权服务发出获取request token的请求。 - The social network responds with information that the application server uses to redirect the user's web browser to a special login page on the social network's domain.
SNS网站把用户的浏览器重定向到SNS网站的登录页面。
更技术点说法:
SNS授权服务响应请求,返回一个尚未认证的request token。
第三方应用获取响应中包含的request token,按照协议规范,附带这个request token,将其重定向到SNS提供的授权页面(User Authorization URL)。 - If the user is logged out of the social network, they input their username and password as if they were normally logging into the site. After they log in, or if they were already logged in (with a cookie), they are asked by the social network to share data with the application.
如果用户没有登录,用户向普通登录一样,输入用户名和密码完成登录。如果用户已经登录(使用记录Cookie的方式),会出现一个页面,问用户是否允许共享他的SNS信息给第三方网站。
更技术点说法:
在Google提供的授权页面上,用户按照提示输入用户账号信息。
- Once permission has been granted, the social network redirects the user's web browser to a predefined URL on the application server, along with a token that can be used to access the user's information.
一旦用户选择信任第三方网站,SNS网站将把Web浏览器重定向到第三方网站,同时把SNS的用户信息传递过去。
更技术点说法:
用户决定允许或拒绝授权给第三方应用,如果用户拒绝授权给此第三方应用,则被重定向到SNS的页面,而不会再回到第三方应用的页面上。
如果用户授权给第三方应用,那么,SNS授权服务接收此请求,将用户重定向到第三方应用提供的页面上,并传递被认证了的request token。 - Using the token as described in the OAuth specification, the application server is now able to access the user's data on the social network.
这样第三方网站就可以访问SNS网站的用户信息了。
更技术点说法:
第三方应用接收到认证的request token后,再次向SNS账号服务发起一次HTTP请求,以换取access token。
SNS 账户授权服务接收请求,验证是否合法。如果合法,则返回一个access token。
从上面的步骤可以看出,用户始终没有将其用户名与密码等信息提供给使用者(第三方软件),从而更安全。
OAUTH相关术语
明白了流程,再看技术术语就会简单很多。在上面流程中,在更技术说法中提到了一些术语,这些OAuth的术语解释如下:
OAUTH相关的三个URL:
- Request Token URL: 获取未授权的Request Token服务地址;
- User Authorization URL: 获取用户授权的Request Token服务地址;
- Access Token URL: 用授权的Request Token换取Access Token的服务地址;
OAUTH相关的参数定义:
- oauth_consumer_key: 使用者的ID,OAUTH服务的直接使用者是开发者开发出来的应用。所以该参数值的获取一般是要去OAUTH服务提供商处注册一个应用,再获取该应用的oauth_consumer_key。如Yahoo该值的注册地址为:https://developer.yahoo.com/dashboard/
- oauth_consumer_secret:oauth_consumer_key对应的密钥。
- oauth_signature_method: 请求串的签名方法,应用每次向OAUTH三个服务地址发送请求时,必须对请求进行签名。签名的方法有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种。
- oauth_signature: 用上面的签名方法对请求的签名。
- oauth_timestamp: 发起请求的时间戳,其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数。本次请求的时间戳必须大于或者等于上次的时间戳。
- oauth_nonce: 随机生成的字符串,用于防止请求的重放,防止外界的非法攻击。
- oauth_version: OAUTH的版本号,可选,其值必须为1.0。
OAUTH HTTP响应代码:
- HTTP 400 Bad Request 请求错误
- Unsupported parameter 参数错误
- Unsupported signature method 签名方法错误
- Missing required parameter 参数丢失
- Duplicated OAuth Protocol Parameter 参数重复
- HTTP 401 Unauthorized 未授权
- Invalid Consumer Key 非法key
- Invalid / expired Token 失效或者非法的token
- Invalid signature 签名非法
- Invalid / used nonce 非法的nonce
参考资料:
OAuth
http://en.wikipedia.org/wiki/OAuth
Developer's Guide: Data API Protocol – OAuth for Web Applications
http://code.google.com/intl/zh-CN/apis/youtube/2.0/developers_guide_protocol_oauth.html
OAUTH协议简介
http://blog.csdn.net/hereweare2009/archive/2009/03/08/3968582.aspx
An OAuth library for .NET consumers and service providers
http://code.google.com/p/oauth-dot-net/
OAuth不断获得动力
http://www.infoq.com/cn/news/2008/06/oauth_spring
豆瓣 API OAuth认证
http://www.douban.com/service/apidoc/auth
OAuth Use Case
http://wiki.opensocial.org/index.php?title=OAuth_Use_Cases