coldfusion - LinkedIn API 中的 OAuth 身份验证问题

标签 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);
  }

我认为问题在于加密的 key 。我将基本字符串与来自 LinkedIn 的 OAuth 测试工具进行了比较,http://developer.linkedinlabs.com/oauth-test/ ,并且它完美匹配,因此用于加密它的 key 必须是我的问题。我还没有 OAuth token secret ,所以我的 secret 类似于 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);
  }

最佳答案

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

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

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

关于coldfusion - LinkedIn API 中的 OAuth 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577654/

相关文章:

pdf - 尝试合并多个 pdf 文件时出现 cfpdf 合并错误

xml - 解析 XML 文档时出错

html - <hr> 在 coldfusion cfdocument 中

c# - 无法从 C# 类访问 ColdFusion Web 服务

ios - 我可以使用 RestKit 0.20.3 提交带有 Yelp 要求的 OAuth 参数的请求吗?

oauth - 如何验证 Google 身份服务的响应

types - CF9 中的 QueryNew() 数据类型

mysql - 在 OS X 中自动启动 Adob​​e Coldfusion

hibernate - 是否可以在不使用 HBMXML 文件的情况下为 Hibernate 指定软删除过滤器?

asp.net - 使用 Asp.Net Owin Oauth 进行增量 Google OAuth