OAUTH验证流程:(客户端)
先从OAUTH服务商获得:
签名方法查阅:
1.获取授权地址 (程序请求)
oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
oauth_signature :上面的签名方法对请求的签名 (加密key用oauth_consumer_secret)
oauth_timestamp :发起请求的时间戳
oauth_nonce :随机生成的字符串
oauth_version :OAUTH的版本号,值必须为1.0
其他参数
2.服务商返回(程序请求后返回)
oauth_token :返回未授权的token
oauth_token_secret :返回未授权的SECRET
其他参数
3.去服务商得到用户授权 (组成地址页面后跳转到该地址)
oauth_token :服务商返回的token (上一步返回的)
oauth_callback :回调地址
其他参数
4.服务商引导用户登录,返回 (登录后会跳转到回来,一般有GET参数,根据OAUTH服务商而不同)
oauth_token :服务商返回的token[备注:可能不会返回,如果没返回上上面的那个token,YAHOO就是如此](跟上面的oauth_token同个值)
其他参数
5.发送用户授权请求 (程序请求)
oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
oauth_token :服务商返回的token
oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
oauth_signature :上面的签名方法对请求的签名(加密key:oauth_consumer_secret&oauth_token_secret)
oauth_timestamp :发起请求的时间戳
oauth_nonce :随机生成的字符串
oauth_version :OAUTH的版本号,值必须为1.0
其他参数
6.服务商返回 (获取到授权后的token,未授权的token没用了)
oauth_token :服务商返回的得到用户授权的token
oauth_token_secret :服务商返回的secret
其他参数
/**/
有些服务商需要再次得到用户的一些授权,如FACEBOOK,此部分内容不属于oauth部分,一般无token传递
/**/
7.得到用户授权,取用户的资料
oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
oauth_token :服务商返回的得到用户授权token (授权token)
oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
oauth_signature :上面的签名方法对请求的签名 (加密KEY:oauth_consumer_secret&oauth_token_secret)
oauth_timestamp :发起请求的时间戳
oauth_nonce :随机生成的字符串
oauth_version :OAUTH的版本号,值必须为1.0
其他参数
涉及到的key跟 secret有:
应用注册得到的:
oauth_consumer_key
oauth_consumer_secret
请求得到的(2套)1.未授权的,2登录后返回并用未授权的去交换得到已授权的
oauth_token
oauth_token_secret
思路流程如上,可以去豆瓣注册一个帐号来测试这个流程
豆瓣的OAUTH的地址:
http://www.douban.com/service/auth/request_token
http://www.douban.com/service/auth/authorize
http://www.douban.com/service/auth/access_token
实际应用的地址:
http://api.douban.com/people/%40me
OAuth库可以到
http://code.google.com/p/oauth
下载
备注:
Oauth文件的 246行错误 '://' . $_SERVER['HTTP_HOST'] 请更改为: '://' . $_SERVER['SERVER_NAME']
[提示]
在版本r1261已经更正,详细信息请浏览:http://code.google.com/p/oauth/issues/detail?id=192
OAuth授权流程:(OAuth服务器)
1.数据存储
1.注册应用时候的
oauth_consumer_key
oauth_consumer_secret
2.未授权的
oauth_token
oauth_token_secret
3.已授权的 (可以长久存储)
oauth_token
oauth_token_secret
4.防止重复或恶意请求的
oauth_nonce
2,4存储后定期清除
具体实现可以看
http://code.google.com/p/oauth
的OAuth_TestServer.php
以下是对testserver的要重写的方法的详细注释:
//根据$consumer_key查询出key 跟secret记录是否存在
$sconsumer = new OAuthConsumer("key", "secret", NULL);
/*是否有注册记录,有返回consumer,看是否有记录*/
if ($consumer_key == $sconsumer->key) return $sconsumer;
return NULL;
}/*}}}*/
/*查找是否存在授权KEY request || access*/
public function lookup_token($consumer, $token_type, $token) {/*{{{*/
/*是否有注册记录,有返回consumer,看是否有记录*/
$sconsumer = new OAuthConsumer("key", "secret", NULL);
$token_attrib = $token_type . "_token";
switch ($token_type) {
case 'request':
/*根据$consumer检查请已授权的key,secret是否存在,过期*/
$stoken = new OAuthToken("requestkey", "requestsecret", 1);
break;
case 'access':
/*根据$consumer检查请已授权的key,secret是否存在,过期*/
$stoken = new OAuthToken("accesskey", "accesssecret", 1);
break;
default:
return NULL;
break;
}
if ($consumer->key == $sconsumer->key
&& $token == $stoken->key) {
return $stoken;
}
return NULL;
}/*}}}*/
public function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/
/*根据$consumer,$token检查 nonce 是否被使用过,首次请求$token为空*/
$snonce='67bcf7011695556b057932fa8a171bbb';
//用户返回真
/*是否有注册记录,有返回consumer,看是否有记录*/
$sconsumer = new OAuthConsumer("key", "secret", NULL);
$request_token = new OAuthToken("requestkey", "requestsecret", 1);
$access_token = new OAuthToken("accesskey", "accesssecret", 1);
if ($consumer->key == $sconsumer->key
&& (($token && $token->key == $request_token->key)
|| ($token && $token->key == $access_token->key))
&& $nonce == $snonce) {
return $snonce;
}
return NULL;
}/*}}}*/
public function new_request_token($consumer) {/*{{{*/
/*是否有注册记录,有返回consumer,看是否有记录*/
$sconsumer = new OAuthConsumer("key", "secret", NULL);
/*建立之前做必要校验*/
if ($sconsumer->key == $consumer->key) {
/*建立一个未授权KEY,并保存*/
$request_token = new OAuthToken("requestkey", "requestsecret", 1);
/*
备注:
这个token是返回给应用请求的,当应用得到该key在跳到登录页面并登录后
做好已经登录用户于该requestkey的关联,下一步使用
*/
return $request_token;
}
return NULL;
}/*}}}*/
public function new_access_token($token, $consumer) {/*{{{*/
/*是否有注册记录,有返回consumer,看是否有记录*/
$sconsumer = new OAuthConsumer("key", "secret", NULL);
/*
*
用户登录后返回到应用后的请求,检查$token是否登录(上一步的关联)
$token 即上一步返回的requestkey,查询出
/*建立之前做必要校验*/
$request_token = new OAuthToken("requestkey", "requestsecret", 1);
if ($consumer->key == $sconsumer->key
&& $token->key == $request_token->key) {
/*建立一个已授权KEY,并保存*/
$access_token = new OAuthToken("accesskey", "accesssecret", 1);
return $access_token;
}
return NULL;
}/*}}}*/