分类目录归档:PHP

新浪微博OAuth认证流程分析

对新浪微博OAuth认证的一点备忘,不求别人能看明白,只希望自己以后还能看懂……


第一步,通过已知的consumer key和consumer secret获取request token以及request token secret。

private function getRequestToken(){
	$output = $this->OAuthGet(self::$REQUEST_TOKEN, NULL);
	$token = OAuthUtil::parse_parameters($output);
	return new OAuthToken($token['oauth_token'], $token['oauth_token_secret']);
}

这里的$REQUEST_TOKEN为http://api.t.sina.com.cn/oauth/request_token,这个方法不用提供给外部调用,所以可以声明为私有方法。


第二步,获取第一步传回的request token,然后引导用户前往新浪认证页面,认证成功后会返回oauth_verifier。

public function GetAuthorization() {
	$token = $this->getRequestToken();
	$result->Url = self::$AUTHORIZE . "?oauth_token={$token->key}";
	$result->Token = $token;
	return $result;
}

第二步中的$AUTHORIZE为http://api.t.sina.com.cn/oauth/authorize,即认证页面。其中返回的$result->Url加上oauth_callback参数用来做302跳转,而$result->Token要保存起来(可以存到session中)以便在第三步使用。例如:

$info = $oauth->GetAuthorization();
$_SESSION['request_token'] = $info->Token;
header("Location: {$info->Url}&oauth_callback=" . urlencode(CALLBACK_URL . '?ret=' . $_SERVER['REQUEST_URI']));

第三步,用户在第二步中http://api.t.sina.com.cn/oauth/authorize认证成功之后,新浪会带上oauth_verifier参数再跳转一次,地址是由上一步oauth_callback参数指定的。这一步会连同第一步返回的request token和request token secret以及第二步返回的oauth_verifier做最后一次认证,通过之后返回access token和access token secret,这对密钥可以用来访问受限的资源,认证流程到此结束。

public function GetAccessToken($token, $verifier) {
	$output = $this->OAuthGet(self::$ACCESS_TOKEN . "?oauth_verifier=$verifier", $token);
	$token = OAuthUtil::parse_parameters($output);
	return new OAuthToken($token['oauth_token'], $token['oauth_token_secret']);
}

第三步认证其实是在上一步oauth_callback参数指定的地址中进行的,其中$ACCESS_TOKEN为http://api.t.sina.com.cn/oauth/access_token。