为Twitter OAuth生成哈希值的技术咨询
生成Twitter OAuth HMAC-SHA1签名的步骤
嘿,我帮你一步步搞定这个签名生成的问题,完全贴合Twitter的OAuth1签名规则:
核心前提
首先你得有两个关键密钥(这些是你在Twitter开发者平台创建应用时拿到的,官方示例里的对应测试密钥是公开的):
- 消费者密钥(Consumer Secret):
kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw - 令牌密钥(Token Secret):
LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
步骤1:构造签名密钥
按照规则,签名密钥需要把URL编码后的消费者密钥和URL编码后的令牌密钥用&拼接起来:
URL_ENCODED_CONSUMER_SECRET & URL_ENCODED_TOKEN_SECRET
代入示例值的话,因为这两个密钥本身没有特殊字符,URL编码后和原字符串一致,所以最终签名密钥是:
kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
步骤2:执行HMAC-SHA1哈希计算
用上面的签名密钥作为HMAC的密钥,把你提供的完整签名基串(注意你给出的基串末尾有省略号,官方示例里的完整串包含oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521)作为消息,执行HMAC-SHA1哈希。
如果你用命令行工具(比如openssl)来计算,可以用这条命令:
echo -n "POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521" | openssl dgst -sha1 -hmac "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE" -binary | base64
步骤3:Base64编码得到最终签名
HMAC-SHA1生成的是二进制哈希值,需要把它转换成Base64编码的字符串,这就是最终的oauth_signature值。
官方示例的最终签名结果是:
tnnArxj06cWHq44gCs1OSKk/jLY=
关键注意事项
- 确保签名基串是完全URL编码的,并且所有参数按字典序排序(Twitter的规则要求参数必须按ASCII升序排列)
- 计算哈希时一定要用
-n参数(比如echo -n),避免把换行符也加入计算,否则结果会完全错误 - 如果你的实际密钥包含特殊字符(比如
&、=),必须先进行URL编码再拼接成签名密钥
内容的提问来源于stack exchange,提问作者kamaci
相关产品推荐
相关产品推荐

