我正在为客户构建一个库,以便与LinkedIn的API集成,目前我正在开发OAuth。我能够请求初始令牌没问题,并让用户向我的应用程序授予身份验证,但是当我尝试使用oauth_token和oauth_verifier请求访问令牌时(以及我随之发送的其余oauth信息) ,我收到签名无效错误。
我发送的OAuth设置如下:
我还添加了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
答案 0 :(得分:1)
发送POST请求时,您需要将身份验证信息放在标头中,而不是放在查询参数中。
有关信息,请参阅此页面(查找“发送授权标头”): https://developer.linkedin.com/documents/common-issues-oauth-authentication
我怀疑这是你遇到的问题。
答案 1 :(得分:0)
好的,所以这是一个愚蠢的答案,但问题是我没有看到当用户允许访问我的应用程序时oauth_token_secret进来,所以我仍然只是尝试使用消费者秘密和不是消费者的秘密和oauth令牌秘密。