开放平台_OAuth1.0
2011-08-30 13:35 轩脉刃 阅读(8724) 评论(8) 编辑 收藏 举报OAuth1.0简介
oauth1.0是RFC制定的标准的第三方网站/客户端的认证服务
规范文档在:
http://www.ietf.org/rfc/rfc5849.txt
网站使用oauth的目的是不让第三方开发者知道和记录用户的用户名和账号信息,用户在第三方应用登录服务的时候是在客户端提供的登录页面进行登录和验证的。
国内几家大型网站都已经实现了oauth1.0,比如微博,腾讯,开心等
下面以weibo的oauth1.0实现为例说明:
oauth认证分服务器端和客户端
客户端的步骤是:
1 获取未授权的Request Token
2 请求用户授权Request Token
3 使用授权后的Request Token换取Access Token
服务器端的步骤是:
1 发放未授权request_token
2 将用户转到本网站的用户登录页
3 用户登录成功后,返回授权后的request_token和凭证
4 发放最终可以使用的凭证access_token
具体客户端和服务器端操作说明:
1
注册组件
当第三方在服务器网站注册了一个第三方组件,会获得appkey和secret
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_callback和oauth_timestamp是为了放重放的
3
服务器端接收到request_token的未授权请求
应该有如下行为:
1 生成request_token和request_secret
2 在服务器端记录下生成的request_token和request_secret
3 返回request_token和request_secret
4
客户端接收到返回回来的request_token和request_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_token和access_token_secret
3 将access_token,access_token_secret,用户ID,应用ID进行映射,并存在服务器数据库(长期有效)
3 将access_token和access_token_secret返回
11
客户端使用access_token和access_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
实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。