对twitcurl代码做了一些修改,结果遇到了认证失败的错误:
{“errors”:[{“message”:”Could not authenticate you”,”code”:32}]}
通过继续修改twitcurl代码改正问题,学习了twitcurl的认证授权部分代码。其授权部分主要在oauthlib.h和oauthlib.cpp中的oAuth类实现中。下面主要分析一下oAuth::getOAuthHeader方法。
外部数据
Http URL: https://api.twitter.com/1.1/search/tweets.json Http头参数:
|参数键|参数值 |—– |q|va |count|23 |result_type|recent
Http授权参数:
|参数键|参数值 |—– |oauth_consumer_key|xvz1evFS4wEEPTGEFPHBog |oauth_signature_method|HMAC-SHA1 |oauth_token|370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb |oauth_version|1.0
oAuth::getOAuthHeader方法
- 通过buildOAuthHttpParameterKeyValPairs(params, true,rawKeyValuePairs);对Http头参数中参数值进行百分号编码(URL编码),编码后结果放在哈希表rawKeyValuePairs中
rawKeyValuePairs:
键 值 q va count 23 result_type recent - 假定HTTP内容是经过百分号编码的,通过buildOAuthRawDataKeyValPairs( rawData,false, rawKeyValuePairs );找到内容中的键值对,放入哈希表rawKeyValuePairs中
rawKeyValuePairs:
键 值 q va count 23 result_type recent - 通过buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin,std::string( "" ), rawKeyValuePairs, true );创建认授权证:
rawKeyValuePairs:
键 值 说明 q va count 23 result_type recent oauth_consumer_key xvz1evFS4wEEPTGEFPHBog oauth_nonce 131862295819c twitcurl实现就是时戳项加一个随机数 oauth_signature_method HMAC-SHA1 固定值 oauth_timestamp 1318622958 oauth_token 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb oauth_version 1.0 固定值 - 通过getSignature( eType, pureUrl, rawKeyValuePairs,oauthSignature );获得签名
- 生成 sigBase:
- 使用consumer_secret和token_secret组成signing_key,使用HMAC_SHA1算法通过sigBase和signing_key生成摘要strDigest:B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6(非真实计算而得数据)
- 通过base64_encode进行编码:tnnArxj06cWHq44gCs1OSKk/jLY= (非真实计算而得数据)
- 通过百分比编码获得最终签名: (非真实计算而得数据)
- 通过rawKeyValuePairs.clear();清除OAuth不需要的键值对
- 通过buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, oauthSignature, rawKeyValuePairs, false );重新创建认授权证:
rawKeyValuePairs:
键 值 说明 oauth_consumer_key xvz1evFS4wEEPTGEFPHBog oauth_nonce 131862295819c twitcurl实现就是时戳项加一个随机数 oauth_signature_method HMAC-SHA1 固定值 oauth_timestamp 1318622958 oauth_token 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb oauth_version 1.0 固定值 oauth_signature - 最终生成HTTP授权头:
参考
Twitter OAuth Overview
Twitter sign in implementation
Creating a signature
Authorizing a Twitter request
Percent encoding parameters for Twitter
Github: mryqu/twitcurl