LinkedIn API中的OAuth身份验证问题

时间:2012-03-06 03:51:57

标签: coldfusion oauth coldfusion-9

我正在为我的客户创建一个LinkedIn库,并且在通过拼图的授权部分时遇到了一些麻烦。我在RIAForge上使用了OAuth库并重写了所有内容,以便在CF9和MXUnit测试中使用基于脚本的CFC。当我尝试使用HMAC-SHA1算法创建OAuth签名时,我似乎无法匹配LinkedIn正在寻找的内容。他是我签署我的请求的方法:

  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 = JavaCast('string', secret).getBytes();

    local.mac = createObject('java', 'javax.crypto.Mac').getInstance('HmacSHA1');
    local.key = createObject('java', 'javax.crypto.spec.SecretKeySpec').init(secret, local.mac.getAlgorithm());

    base = reReplaceNoCase(Arguments.req.getRequestUrl(), 'http[s]?://', '/');
    params = listSort(params, 'text', 'asc', '&');
    base = JavaCast('string', "#base#&#params#").getBytes();

    local.mac.init(local.key);
    local.mac.update(base);

    Arguments.req.addParameter('oauth_signature', toBase64(mac.doFinal()), true);
  }

这个问题,我相信是加密的秘密密钥。我已经将基本字符串与LinkedIn http://developer.linkedinlabs.com/oauth-test/中的OAuth测试工具进行了比较,并且它完全匹配,因此用于加密它的密钥必须是我的问题。我还没有OAuth令牌的秘密,所以我的秘密类似于fdsa43fdsa3j&。是应该是什么,或者最后的&符号应该是编码格式还是别的?

正确方法

  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());
    params = listSort(params, 'text', 'asc', '&');
    base = "#base#&#Variables.encoder.parameterEncodedFormat(params)#";

    local.mac.init(local.key);
    local.mac.update(JavaCast('string', base).getBytes());
    //writeDump(toString(toBase64(mac.doFinal()))); abort;
    Arguments.req.addParameter('oauth_signature', toString(toBase64(mac.doFinal())), true);
  }

1 个答案:

答案 0 :(得分:1)

Ben Nadel has an example使用OAuth连接到Twilio。您的签名代码与他之间的主要区别在于他在设置SecretKeySpec时使用了一些编码。

以下是他帖子中的相关剪辑:

<cfset secretKeySpec = createObject(
    "java",
    "javax.crypto.spec.SecretKeySpec"
  ).init(
    toBinary( toBase64( twilioAuthKey ) ),
    "HmacSHA1"
  )
/>