【问题标题】:OAuth making requests against LinkedIn API cause 401 errorOAuth 向 LinkedIn API 发出请求会导致 401 错误
【发布时间】:2012-03-14 22:32:27
【问题描述】:

我正在为与 LinkedIn API 集成的客户端创建应用程序。我通过身份验证没有太多问题,但一切正常,现在我需要提出实际请求。我主要在 Share API 中工作。我使用以下方法创建 HTTP 调用:

  public any function sendRequest(any req){
    var param = false;
    var headParams = [];
    var bodyParams = [];
    var call = new http(proxyserver='192.168.201.12', proxyport=8888);
    var i = 1;

    call.setUrl(Arguments.req.getRequestUrl());
    call.setMethod(Arguments.req.getMethod());

    getSigner().signRequest(Arguments.req);

    headParams = Arguments.req.getParameters(true);
    bodyParams = Arguments.req.getParameters();

    if(arrayLen(bodyParams)){
      call.addParam(
        type='header',
        name='Authorization',
        value="OAuth#Variables.encoder.encodedParameter(Arguments.req.getParameters(true), true, false, true)#"
      );
    }

    // Header parameters
    if(!arrayLen(bodyParams)){
      for(i=1; i<=arrayLen(headParams); i++){
        param = headParams[i];
        call.addParam(
          type=Arguments.req.getParameterType(),
          name=Variables.encoder.parameterEncodedFormat(param.name),
          value=param.value
        );
      }
    }

    // Body parameters (should only be 1)
    if(arrayLen(bodyParams)){
      for(i=1; i<=arrayLen(bodyParams); i++){
        param = bodyParams[i];
        call.addParam(
          type='xml',
          value=param.value
        );
      }
    }
    return call.send().getPrefix();
  }

当我签署请求时,我使用以下方法:

  public void function signRequest(any req){
    var headParams = Arguments.req.getParameters(true);
    var bodyParams = Arguments.req.getParameters();
    var secret = "#Variables.encoder.parameterEncodedFormat(getConsumer().getConsumerSecret())#&#Variables.encoder.parameterEncodedFormat(Arguments.req.getOAuthSecret())#";
    var base = '';

    params = Variables.encoder.encodedParameter(headParams, true, true);
    params = "#params#&#Variables.encoder.parameterEncodedFormat(bodyParams[1].value)#";

    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)#";
    //writeDump(base) abort;
    local.mac.init(local.key);
    local.mac.update(JavaCast('string', base).getBytes());

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

我尝试仅使用标头参数(通常的 OAuth 参数)对其进行签名并包含正文参数(xml 字符串),但一切都给了我 401 错误,所以我想知道我应该在我的基本字符串中使用什么是否为请求签名?

【问题讨论】:

    标签: coldfusion oauth linkedin coldfusion-9


    【解决方案1】:

    不是您问题的正确答案,但可能对您有所帮助。

    在我多次尝试使用带有 CF8 的 LinkedIn API 失败后,我终于放弃了/没有更多时间去做。我使用了linkedin-j Java 库,而不是“适当的”集成。它终于让我走了,我没有再遇到任何签名问题。

    顺便说一句,对于我所有需要 OAuth 的集成,我都使用了 this 库,并且没有任何与 LinkedIn API 一样的签名问题。

    【讨论】:

    • Lucas,我​​开始使用linkedin-j 来实现我的API 连接器,但是一旦我完成了OAuth 实现并转移到API 方法上,我一直收到这个错误:` javax.xml.bind.JAXBException :“com.google.code.linkedinapi.schema”不包含 ObjectFactory.class 或 jaxb.in​​dex`。我想知道您是否处理过它,以及您是如何通过的?
    • 你从code.google.com/p/linkedin-j/downloads/list这里得到了哪个zip?应该获得linkedin-j-1.0.415-binary.zip 或1.0.429 beta 二进制文件。从那里获取所有 JAR 并将它们放在它们应该在服务器上的位置(取决于设置,通常在#server.ColdFusion.ROOTDIR#\lib 中)。然后,您需要重新启动 CF。从您发布的错误来看,似乎缺少其中一个 JAR。
    • 我实际上是在使用 JavaLoader 并且必须重新编译linkedin-j JAR 以包含一些特殊的东西才能让 JAXB 正常工作。它在问题页面上的问题 #53 中。
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 2022-01-10
    • 2017-12-08
    • 1970-01-01
    • 2018-06-13
    • 2015-11-28
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多