OAuth2.0应用开发代码探讨
2012-08-13 09:42 smat 阅读(630) 评论(0) 编辑 收藏 举报最近公司因为业务原因需要开发一套类似于一些网站或论坛那样的QQ快捷授权登录的程序,因为以前没有接触过OAuth之类的开发,这次是基于个人的一些了解.
这是其它网站的关于OAuth2.0的简单介绍.OAuth1.0已经在2012年4月份废弃啦.而且现在网上一般都是客户端的案例,服务器端的框架和案例是找不到的,因为这是一个公共的协议,具体服务器端怎么处理的请求令牌,怎么验证的访问令牌,都没有介绍.
本人模模糊糊写了一套关于OAuth的服务器端程序,基于MVC3的,不是很规范,但是还没有完成,有些东西还是不是很清楚...
不知道大家有没有这方面的案例参考一下!!!
OAuth 协议提供了一种在不同网站上访问受保护数据的标准方式。AuthSub 和 ClientLogin 方法是 Google 专用的,而 OAuth 则是一种可以在其他网站上实现的开放式协议。与 AuthSub 类似,如果您要构建的网络应用程序可让用户将视频、评论、评分、联系人或其他信息与他们自己的 YouTube 帐户进行关联,则也可以使用 OAuth。如果您的应用程序还与除 YouTube API 以外的其他 API 集成,而这些 API 同样支持 OAuth 协议,那么您可能会特别青睐 OAuth。要了解 OAuth 的详情,请访问 http://oauth.net。
了解 OAuth 令牌
OAuth 身份验证使用以下两类令牌:
- 请求令牌,该令牌确保最终用户授权您的应用程序代表该用户提交 API 操作。YouTube 还使用请求令牌确认您已经向 Google 注册了您的应用程序。
- 访问令牌,该令牌可让您的应用程序代表某个特定用户执行 YouTube 数据 API 操作。
注意:您的应用程序必须向每个用户提供唯一的请求令牌和访问令牌。此外,您的应用程序还需要一种存储访问令牌以便日后使用的机制。
身份验证过程分为三个阶段:
-
您的应用程序检索到一个未授权的请求令牌。Google 先确认您已注册了应用程序,然后返回该令牌。请求令牌的有效时间只有一个小时。
-
您的应用程序将用户重定向至 Google 登录网页。重定向网址会指定在步骤 1 中检索到的未授权请求令牌的值,以及回调网址。
在用户登录自己的 YouTube 帐户后,Google 会显示一个网页,供用户选择是否允许您的应用程序代表他们执行 YouTube API 操作。如果用户向您的应用程序授予了这一访问权限,则未授权令牌会成为已授权令牌。(令牌值不变)。用户还会被重定向至您指定的回调网址。
-
您的应用程序用已授权的请求令牌交换访问令牌。只能交换已授权令牌,而且每个请求令牌只能交换一次。该访问令牌与单个用户帐户进行关联,而您的应用程序应使用该令牌代表用户提交经过身份验证的 API 请求。
设置 OAuth 身份验证
您必须完成以下步骤,才能让您的网络应用程序使用 OAuth 协议对用户进行身份验证:
-
向 Google 注册您的网络应用程序。
有关注册过程的说明和注册的要求,请参见基于网络的应用程序的注册。
注意:有关获取或使用 OAuth 令牌的所有请求都必须经过签名。Google 支持 RSA-SHA1 和 HMAC-SHA1 签名算法。
- 如果您的应用程序使用的是 RSA-SHA1 签名算法,则您需要在注册过程中向 Google 上传安全证书。
- 如果您的应用程序使用的是 HMAC-SHA1 签名算法,请在填写注册信息时将证书字段留空。在您完成注册过程后,Google 将会生成 OAuth 消费者密钥值,并显示在您的域的注册网页上。然后,您就可以使用该值对请求进行签名了。
-
设置 OAuth 令牌的管理机制。
您的应用程序在从 YouTube 获得 OAuth 访问令牌后,就会将它用于相应的 YouTube API 请求(应用程序代表与该令牌相关联的用户提出的请求)。因此,您的应用程序需要存储这些令牌,并追踪每个令牌所对应的有效用户。您的应用程序不应在每次需要代表某个特定用户与 YouTube 进行交互时,都尝试检索一个新的访问令牌。事实上,令牌受到安全保护的程度不应低于您应用程序中存储的任何其他敏感用户信息。
使用 OAuth
正如了解 OAuth 令牌部分所述,OAuth 身份验证过程包括三个步骤。下文分别介绍了这三个步骤:
步骤 1:获取请求令牌
要获取请求令牌,请将经过签名的请求发送到 https://www.google.com/accounts/OAuthGetRequestToken
。在您的请求中加入以下参数。请注意,唯一的可选参数是oauth_version
;所有其他参数都是必需的。
参数 | 说明 |
---|---|
oauth_consumer_key |
此值用于指定与您的应用程序相关联的域,而这个域必须与您向 Google 注册的域相同。 |
oauth_signature_method |
此值指定了用于对请求进行签名的签名算法。此参数支持的值为 RSA-SHA1 和 HMAC-SHA1 。 |
oauth_signature |
此值用于指定使用引用的签名方法所生成的字符串(签名)。有关详细信息,请参见对使用 OAuth 身份验证的请求进行签名 |
oauth_timestamp |
此值用于指定请求的发送时间。时间戳应表示为 1970 年 1 月 1 日 00:00:00 GMT 以后的秒数。 |
oauth_nonce |
此值是以十进制格式的 ASCII 字符串形式编码的随机 64 位未签名数字。随机数/时间戳的配对应该始终唯一,以防止重放攻击。 |
oauth_version |
此值用于指定 Google 在处理您请求时所用 OAuth 的版本。默认值为 1.0 。如果您的请求中包含此参数,则参数值必须为 1.0 。 |
scope |
此参数标识了您为了提出已通过身份验证的请求而要尝试访问的服务。此参数是 Google 专用的,并且未在 OAuth 标准中进行定义。将该参数的值设置为 http://gdata.youtube.com 。 |
以下是指定这些参数的三种方法:
-
在 GET 或 POST 请求的
Authorization
标头中加入这些参数。下面的示例请求演示了如何在Authorization
标头中指定这些值。请注意,不能在标头中指定scope
参数。可以在请求网址或 POST 请求的正文中将 scope 指定为查询参数。 -
在 POST 请求的正文中指定这些参数。如果您选择使用此方法,则必须将
Content-Type
请求标头的值设置为application/x-www-form-urlencoded
。 -
在 GET 请求的请求网址中以查询参数的形式加入这些参数。
有关详细信息,请参见 OAuth 规范(5.2 部分)。
示例请求
此示例要求提供一个请求令牌,以便访问用户的 Google 日历帐户和 Picasa 帐户。
POST /accounts/OAuthGetRequestToken HTTP/1.1 Host: https://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" scope=http://gdata.youtube.com
关于响应
如果请求成功,Google 就会回复一条包含请求令牌和令牌密钥的 HTTP 200 讯息。您的应用程序需要解析上述响应中的令牌。
如果请求不成功,Google 就会回复一条 HTTP 400 讯息(错误请求)。此响应可能表示请求的格式不正确,也就是说请求中可能存在不支持的参数(或缺少某些参数)、不支持的签名方法或其他请求格式错误。此响应可能还表示 Google 确信请求者不是善意诚信的。
下面的示例展示了对成功令牌请求的响应:
oauth_token=ab3cd9j4ks73hf7g&oauth_token_secret=ZXhhbXBsZS5jb20
步骤 2:向请求令牌授权
您检索到请求令牌后,请将用户重定向至 https://www.google.com/accounts/OAuthAuthorizeToken
。向该网址添加以下查询参数:
示例请求
以下示例展示了对未授权的令牌进行授权的请求:
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=ab3cd9j4ks73hf7g&oauth_callback=http%3A%2F%2Fwww.example.com
关于响应
如果 Google 接受了该请求,就会将用户重定向至 YouTube 登录网页。用户登录后,身份验证服务会显示一个网页,告知用户您的应用程序想要访问其 YouTube 帐户。该网页会提示用户确认您的应用程序有权访问其帐户。
如果用户向您的应用程序授予了访问权限,该用户就会被重定向至您在授权请求令牌的请求中指定的回调网址。如果用户拒绝授予权限,该用户就会被重定向至一个网页,其中显示了返回您网站的链接以及指向 YouTube 的链接。
以下网址显示了使用已授权请求令牌返回回调网址的重定向格式。已授权令牌的值与请求中所发送的未授权令牌的值相同。该值为文本字符串,最多 256 个字节。
http://www.example.com/ytapi.html?oauth_token=CKF50YzIHxCT85KMAg
步骤 3:用请求令牌交换访问令牌
在向用户的请求令牌授权后,您的应用程序就可以用该令牌交换访问令牌了。访问令牌可让您代表特定用户提交已通过身份验证的 YouTube API 请求。访问令牌不会过期,可以像AuthSub 会话令牌一样有效地发挥作用。
要用已授权请求令牌交换访问令牌,请使用以下查询参数向 https://www.google.com/accounts/OAuthGetAccessToken
发送经过签名的 HTTP 请求。请注意,除 oauth_token
参数以外的所有这些参数还可以用于获取请求令牌的请求(适用于相同情况)。此外,oauth_version
是唯一的可选参数;所有其他参数都是必需的。
参数 | 说明 |
---|---|
oauth_consumer_key |
此值用于指定与您的应用程序相关联的域,而这个域必须与您向 Google 注册的域相同。此值必须与用于获取请求令牌的请求中提供的值相同。 |
oauth_token |
此值用于指定已授权的请求令牌。 |
oauth_signature_method |
此值指定了用于对请求进行签名的签名算法。此参数支持的值为 RSA-SHA1 和 HMAC-SHA1 。 |
oauth_signature |
此值用于指定使用引用的签名方法所生成的字符串(签名)。 |
oauth_timestamp |
此值用于指定请求的发送时间。时间戳应表示为 1970 年 1 月 1 日 00:00:00 GMT 以后的秒数。 |
oauth_nonce |
此值是以十进制格式的 ASCII 字符串形式编码的随机 64 位未签名数字。随机数/时间戳的配对应该始终唯一,以防止重放攻击。 |
oauth_version |
此值用于指定 Google 在处理您请求时所用 OAuth 的版本。默认值为 1.0 。如果您的请求中包含此参数,则参数值必须为 1.0 。 |
由于您的应用程序可用于在获取请求令牌时指定参数,因此它也可以使用相同的三个机制指定这些参数。
示例请求
以下示例用请求令牌交换访问令牌:
POST /accounts/OAuthGetAccessToken HTTP/1.1 Host: https://www.google.com Content-Type: application/x-www-form-urlencoded Authorization: OAuth oauth_consumer_key="example.com", oauth_token="CKF50YzIHxCT85KMAg", oauth_signature_method="RSA-SHA1", oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d65724c61686176", oauth_version="1.0"
关于响应
Google 会对获取访问令牌的成功请求回复一条 HTTP 200 讯息,其中包含访问令牌和令牌密钥。以下示例展示了包含 OAuth 访问令牌的示例响应:
oauth_token=ab3cd9j4ks73hf7g&oauth_token_secret=ZXhhbXBsZS5jb20
如果令牌请求的格式不正确,或者 Google 确定请求者不是善意诚信的,则 Google 可能会拒绝这样的令牌请求。如果请求不成功,Google 就会返回 HTTP 400(错误请求)响应代码。
对使用 OAuth 身份验证的请求进行签名
您必须对检索或使用 OAuth 令牌的所有 API 请求进行签名。此要求适用于获取请求令牌或访问令牌的调用,也适用于需要身份验证的所有 YouTube 数据 API 请求(如上传视频或向视频添加评分)。
以下步骤介绍了如何针对使用 OAuth 身份验证的请求生成签名。
-
使用
oauth_signature_method
参数可指定请求所使用的签名算法。Google 支持 RSA-SHA1 和 HMAC-SHA1 签名算法。 -
构建签名
base string
,其中包含三个使用 & 字符连接的请求元素。请注意,所有参数名称和值都必须按照 OAuth 规范(5.1 部分)中所述的要求进行编码。-
第一个元素用于指定 HTTP 请求方法(GET、POST 等)。
-
第二个元素用于指定请求的基本网址。该网址中不得包含任何查询参数。举例而言,如果请求网址是
http://gdata.youtube.com/feeds/api/videos?q=football&orderby=published&v=2
,则基本网址是http://gdata.youtube.com/feeds/api/videos
。 -
第三个元素包含了请求中参数和参数值的标准化字符串。该字符串应包含请求网址中指定的任何查询参数,以及除
oauth_signature
参数以外的所有 OAuth 参数。OAuth 规范(9.1.1 部分)介绍了如何对字符串进行标准化。
-
-
使用指定的
oauth_signature_method
生成oauth_signature
。- 则应使用相应的私有密钥(与您在注册过程中上传到 Google 的证书相对应)生成签名。
- 如果您使用的是 HMAC-SHA1,则应使用在注册过程中生成的“消费者密钥”值生成签名(该值显示在您的域的注册网页上)。
OAuth 规范(附录 A.5)提供了可用于测试 HMAC-SHA1 签名的示例请求。该示例包含了签名基本字符串和 HMAC-SHA1 密钥,以及生成的 HMAC-SHA1 摘要(签名)。
注意:有关对 OAuth 请求进行签名的详细信息,请参见 OAuth 规范(第 9 部分)。
流程图
下图展示了使用 OAuth 协议对用户进行身份验证所涉及的步骤。与 AuthSub 和 ClientLogin 身份验证类似,OAuth 身份验证也可以使用直接上传或基于浏览器上传的方法。
该图像展示了以下步骤:
-
用户点击您网站上的链接,开始执行需要身份验证的 API 操作。
-
您的应用程序确定您是否为该用户存储了 OAuth 访问令牌。如果有访问令牌,则应用程序会跳至步骤 14。如果没有访问令牌,则应用程序会执行步骤 3。
-
您的应用程序提交已签名的请求,以便从 Google 的 OAuth 身份验证服务获得请求令牌。
-
Google 使用未经授权的请求令牌响应您的请求,该令牌由您从响应中解析得出。
-
您的应用程序将用户重定向至 YouTube 帐户身份验证服务。重定向网址标识未经授权的请求令牌和回调网址。
-
用户的浏览器向 YouTube 的帐户身份验证服务发送请求,从而处理重定向。
-
YouTube 帐户身份验证服务显示同意访问网页,提示用户登录 YouTube 帐户,并同意或拒绝您的应用程序执行有关该帐户的 API 操作。
-
用户登录并授予应用程序对帐户的访问权限。
-
如果用户授予了访问权限,则 YouTube 将用户重定向回您通过步骤 6 添加到网址中的回调网址。用户也可以拒绝授予帐户访问权限,在这种情况下,YouTube 会显示带有链接的网页,用户点击这些链接即可返回您的应用程序和 YouTube 网站。
-
用户的浏览器处理重定向并向您的回调网址发送请求。重定向网址包含经过授权的请求令牌值。(经过授权的请求令牌拥有与未经授权的请求令牌相同的值。)
-
您的应用程序向 YouTube 的 OAuth 身份验证服务提交已签名的请求,以便将请求令牌交换为访问令牌。
-
YouTube 使用访问令牌响应您的请求。
-
您的应用程序从响应中解析出访问令牌并存储令牌值,该值与特定用户相关联。以后,对于同一个用户,应用程序会使用同一个访问令牌提交经过身份验证的请求。
-
您的应用程序使用访问令牌提交 API 请求,以便对请求进行身份验证。