【问题标题】:Issues with OAuth Authentication in LinkedIn APILinkedIn API 中的 OAuth 身份验证问题
【发布时间】:2023-03-13 04:13:01
【问题描述】:

我正在为我的一个客户开发 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 的 OAuth 测试工具 http://developer.linkedinlabs.com/oauth-test/ 进行了比较,它完全匹配,所以用于加密它的密钥一定是我的问题。我还没有 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);
  }

【问题讨论】:

    标签: coldfusion oauth coldfusion-9


    【解决方案1】:

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

    这是他帖子中的相关片段:

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

    【讨论】:

    • 谢谢帕特,我可以说这是我的答案,因为当我去本纳德的页面时,我的照片出现了;)
    • 感谢您的帮助。这不一定是 100% 正确的答案,但它让我朝着正确的方向前进。我已经在上面发布了正确的方法,希望能对其他人有所帮助。
    • @DaveLong:您应该将其作为单独的答案发布并接受它,而不是修改您的问题。这将作为未来读者的路标。或者,编辑帕特里克的答案以匹配您使用的解决方案,以便他可以保留“接受”信用。
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多