【发布时间】:2012-03-27 07:15:54
【问题描述】:
我正在为客户构建一个库以与 LinkedIn 的 API 集成,目前正在研究 OAuth 实施。我可以请求初始令牌没有问题,并让用户向我的应用程序授予身份验证,但是当我尝试使用 oauth_token 和 oauth_verifier 请求访问令牌时(以及我发送的其余 oauth 信息) ,我得到一个签名无效的错误。
我发送的 OAuth 设置如下:
- oauth_consumer_key
- oauth_nonce
- oauth_timestamp
- oauth_signature_method
- oauth_version
- oauth_token
- oauth_verifier
我还添加了 oauth_signature,它是所有这些密钥的签名版本。我使用以下方法签署请求:
public void function signRequest(any req){
var params = Arguments.req.getAllParameters();
var secret = "#Variables.encoder.parameterEncodedFormat(getConsumer().getConsumerSecret())#&#Variables.encoder.parameterEncodedFormat(Arguments.req.getOAuthSecret())#";
var base = '';
params = Variables.encoder.encodedParameter(params, true, true);
secret = toBinary(toBase64(secret));
local.mac = createObject('java', 'javax.crypto.Mac').getInstance('HmacSHA1');
local.key = createObject('java', 'javax.crypto.spec.SecretKeySpec').init(secret, local.mac.getAlgorithm());
base = "#Arguments.req.getMethod()#&";
base = base & Variables.encoder.parameterEncodedFormat(Arguments.req.getRequestUrl());
base = "#base#&#Variables.encoder.parameterEncodedFormat(params)#";
local.mac.init(local.key);
local.mac.update(JavaCast('string', base).getBytes());
Arguments.req.addParameter('oauth_signature', toString(toBase64(mac.doFinal())), true);
}
我知道它可以工作,因为我可以使用相同的方法来请求初始令牌(没有 oauth_token 或 oauth_verifier 参数),所以我假设这是我正在签名的参数的问题。 (是的,我在签名之前按字母顺序排列参数)
那么有没有我不应该包含在签名中的参数或另一个我应该包含的参数?
这是一个加密的基本字符串示例:
POST&https%3A%2F%2Fwww.linkedin.com%2Fuas%2Foauth%2FaccessToken&oauth_consumer_key%3Dwfs3ema3hi9s%26oauth_nonce%3D1887241367210%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1331326503%26oauth_token%3D8b83142a-d5a6-452e-80ef-6e75b1b0ce18%26oauth_verifier%3D94828%26oauth_version%3D1.0
【问题讨论】:
标签: coldfusion oauth linkedin coldfusion-9 access-token