代码改变世界

开放平台_OAuth1.0

2011-08-30 13:35  轩脉刃  阅读(8728)  评论(8编辑  收藏  举报

OAuth1.0简介

 

oauth1.0RFC制定的标准的第三方网站/客户端的认证服务

规范文档在:

http://www.ietf.org/rfc/rfc5849.txt

 

网站使用oauth的目的是不让第三方开发者知道和记录用户的用户名和账号信息,用户在第三方应用登录服务的时候是在客户端提供的登录页面进行登录和验证的。

 

国内几家大型网站都已经实现了oauth1.0,比如微博,腾讯,开心等

 

下面以weibooauth1.0实现为例说明:

 

 

 

oauth认证分服务器端和客户端

 

客户端的步骤是:

1 获取未授权的Request Token

2 请求用户授权Request Token

3 使用授权后的Request Token换取Access Token

 

服务器端的步骤是:

1 发放未授权request_token

2 将用户转到本网站的用户登录页

3 用户登录成功后,返回授权后的request_token和凭证

4 发放最终可以使用的凭证access_token

 

具体客户端和服务器端操作说明:

1

注册组件 

当第三方在服务器网站注册了一个第三方组件,会获得appkeysecret

appkey是第三方组件的唯一标识

secret是第三方组件用来加密或其他处理的密钥(这个信息只有第三方应用和服务器端有)

 

2

客户端请求未授权的RequestToken

 

接口:

http://api.t.sina.com.cn/oauth/request_token

 

调用的参数

参数名

必选

介绍

oauth_consumer_key

true

API Key(组件信息中的APP Key)

oauth_signature_method

true

签名方法,暂只支持HMAC-SHA1

oauth_signature

true

签名值

oauth_timestamp

true

时间戳,其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数

oauth_nonce

true

单次值,随机生成的32位字符串(每次请求必须不同)

oauth_callback

true

认证成功后浏览器会被重定向到这个url

oauth_version

flase

版本号,如果填写必须为1.0

 

其中的参数说明

oauth_signature 是使用secret进行签名

oauth_callbackoauth_timestamp是为了放重放的

 

3

服务器端接收到request_token的未授权请求

应该有如下行为:

1 生成request_tokenrequest_secret

2 在服务器端记录下生成的request_tokenrequest_secret

3 返回request_tokenrequest_secret

 

 

4

客户端接收到返回回来的request_tokenrequest_secret,使用这两个值来请求授权的request_token(即认证)

 

接口:

http://api.t.sina.com.cn/oauth/authorize

 

请求参数:

参数名

必选

意义

oauth_token

true

上一步中获得的未授权的Request Token

 

5

服务器端收到认证请求

做如下操作:

1 将请求的oauth_token和服务器端已存的oauth_token进行比较,正确执行2,错误返回异常

2 将客户端(比如浏览器)转到用户在weibo上的认证页面

 

6

客户端展示认证页面提供给用户登录认证

 

7

用户登录认证成功

 

8

服务器端等待用户登录认证成功之后

1 生成request_token已验证的凭证oauth_verifier

2 request_token和用户ID,应用ID,验证码oauth_verifier进行映射,并存储

3 返回给客户端信息:

 

参数名

必选

意义

oauth_token

true

用户授权之后的Token值,与未授权Token值相同

oauth_verifier

true

验证码

 

oauth_verifier是已验证凭证

4 转到用户请求未授权request_token时请求的oauth_callback地址

(一般第二步和第三步是同时进行的,转到的oauth_callback地址的同时传递结果)

 

 

9

请求access_token 

客户端现在已经有了:

appkey //组件申请时获得

secret //组件申请时获得

request_token//组件请求未授权request_token时获得

request_secret//组件请求未授权request_token时获得

oauth_veifier//组件请求授权request_token时获得

 

secret&request_secret作为加密的key对参数进行加密请求:

(这步是来请求可以直接使用的凭证access_token)

 

http://api.t.sina.com.cn/oauth/access_token

 

参数

参数名

必选

意义

oauth_consumer_key

true

API Key

oauth_token

true

第一步中获得的Request Token

oauth_signature_method

true

签名方法,暂只支持HMAC-SHA1

oauth_signature

true

签名值,(密钥为:APP Secret&Request Token Secret)

oauth_timestamp

true

时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数

oauth_nonce

true

单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同)

oauth_verifier

true

上一步请求授权request token时返回的验证码

oauth_version

flase

版本号,如果填写必须为1.0

 

10

服务器端获取到access_token的请求做如下操作:

1 校验request_token是否正确且已经被授权过(校验的内容有1 签名2 oauth_verifier 3 oauth_token)

2 生成access_tokenaccess_token_secret

3 access_tokenaccess_token_secret,用户ID,应用ID进行映射,并存在服务器数据库(长期有效)

3 access_tokenaccess_token_secret返回

 

11

客户端使用access_tokenaccess_token_secret进行其他接口的请求

 

参考文章:

http://open.weibo.com/wiki/Oauth

http://www.ietf.org/rfc/rfc5849.txt

http://wiki.open.kaixin001.com/index.php?id=OAuth%E6%96%87%E6%A1%A3

http://dev.baidu.com/wiki/app/index.php?title=OAuth1.0