分享到 :

签名参数oauth_signature的说明

oauth_signature
将请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性。 签名值的生成共有3个步骤:构造源串,构造密钥,生成签名值。详见下面的描述:

Step 1. 构造源串

源串由3部分内容用“&”拼接起来:

HTTP请求方式 & urlencode(uri) & urlencode(a=x&b=y&...)

 

1.1 构造步骤

第1步:将请求的URI路径进行URL编码。

第2步:将除“oauth_signature”外的所有参数按key进行字典升序排列。

第3步:将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码。

第4步:将HTTP请求方式(GET或者POST)以及第1步和第3步中的字符串用&拼接起来。

 

1.2 示例

 

原始请求信息

HTTP请求方式:GET

oauth_consumer_key:123456

请求的URI路径(含HOST):http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token

请求参数:

oauth_version=1.0&

oauth_signature_method=HMAC-SHA1&

oauth_timestamp=1299143758&

oauth_nonce=1606024431&

oauth_consumer_key=200001

 

下面开始生成oauth_signature:

第1步:将请求的URI路径进行URL编码

得到:http%3A%2F%2Fopenapi.qzone.qq.com%2Foauth%2Fqzoneoauth_request_token

第2步:将除“oauth_signature”外的所有参数按key进行字典升序排列

得到:

oauth_consumer_key,oauth_nonce,oauth_signature_method,oauth_timestamp,oauth_version

第3步:将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码

将第2步中排序后的参数拼接起来:

oauth_consumer_key=200001&oauth_nonce=1606024431&
oauth_signature_method=HMAC-SHA1& oauth_timestamp=1299143758& oauth_version=1.0

 

进行URL编码后得到:

http%3A%2F%2Fopenapi.qzone.qq.com%2Foauth%2Fqzoneoauth_request_token&
oauth_consumer_key%3D200001%26 oauth_nonce%3D1606024431%26
oauth_signature_method%3DHMAC-SHA1%26 oauth_timestamp%3D1299143758%26 oauth_version%3D1.0

 

第4步:将HTTP请求方式,第1步以及第3步中的到的字符串用&拼接起来

得到源串:

GET&http%3A%2F%2Fopenapi.qzone.qq.com%2Foauth%2Fqzoneoauth_request_token&
oauth_consumer_key%3D200001%26 oauth_nonce%3D1606024431%26 oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1299143758%26 oauth_version%3D1.0

 

Step 2. 构造密钥

密钥由2部分内容用“&”拼接起来:

oauth_consumer_secret & oauth_token_secret

2.1 注意事项

1. oauth_consumer_secret:对应申请QQ登录时分配的appkey。 2. oauth_token_secret:OAuth认证过程中动态获取到的密钥值,用户密钥拼接。拼接时需注意每一步使用的密钥值不同:
(1)OAuth认证第1步,不需要oauth_token_secret,置为空。即拼接时直接在oauth_consumer_secret后加&;
(2)在OAuth认证第5步,使用第2步返回的oauth_token_secret。拼接方式为:oauth_consumer_secret&oauth_token_secret;
(3)OAuth认证第7步,使用第6步返回的oauth_token_secret。拼接方式为:oauth_consumer_secret&oauth_token_secret。

2.2 示例

原始信息

oauth_consumer_secret=123456789  OAuth认证第2步返回:oauth_token_secret=aaaaaa

OAuth认证第6步返回:oauth_token_secret=bbbbbb

 

OAuth认证的第1步的密钥

在OAuth认证第1步,不需要oauth_token_secret,直接在oauth_consumer_secret后加&,得到: 123456789&

 

OAuth认证的第5步的密钥

在OAuth认证第5步,使用第2步返回的oauth_token_secret,得到: 123456789&aaaaaa

 

OAuth认证的第7步的密钥

OAuth认证第7步,使用第6步返回的oauth_token_secret,得到: 123456789&bbbbbb

Step 3. 生成签名值

3.1 生成签名值的步骤

1. 使用HMAC-SHA1加密算法,将Step1中的到的源串以及Step2中得到的密钥进行加密。

2. 然后将加密后的字符串经过Base64编码,即得到oauth_signature签名参数的值。

3.2 PHP代码示例

请从SDK下载页面下载PHP SDK,见目录comm下utils.php中的get_signature方法的示例。

$oauth_signature= base64_encode(hash_hmac("sha1", $源串, $密钥, true));

PHP中使用hash_hmac时需注意: 1. 需要确保PHP版本支持hash_hmac函数,即PHP 5 >= 5.1.2, PECL hash:1.1-1.5。

2.hash_hmac方法最后一个参数为true,不要用默认值。

调试工具

我们提供了调试工具,帮助开发者检测QQ登录授权以及调用OpenAPI时发送的请求参数是否正确,提交相关信息后可获得服务器的验证结果。 调试工具页面: http://open.qzone.qq.com/oauth_tool/oauth_url_check.htm

返回顶部