OAuth对LinkedIn API的请求导致401错误

OAuth对LinkedIn API的请求导致401错误

问题描述:

我正在为与LinkedIn API集成的客户端创建应用程序。我通过了身份验证,没有太多问题,但所有工作都正常,现在我需要提出实际的请求。主要是我在Share API中工作。我创建具有以下方法HTTP调用:OAuth对LinkedIn API的请求导致401错误

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 PARAMS )并包含body参数(xml字符串),但是所有事情都会给我一个401错误,所以我想知道在应用程序的基础字符串中应该使用什么?

不是你的问题的正确答案,但可以帮助你。

在我的情况下,经过很多不成功的使用LinkedIn API与CF8的尝试后,我终于放弃了/没有更多的时间。我已经使用了linkedin-j Java库,而不是“正确的”集成。它终于让我走了,我没有遇到任何更多的签名问题。

顺便说一句,我所有的需要OAuth的集成我已经使用this库,并没有任何签名问题,如LinkedIn API。

+0

Lucas,我​​开始使用linkedin-j来实现我的API连接器,但是一旦我完成OAuth实现并转移到API方法中,我就不断收到此错误:' javax.xml.bind.JAXBException:“com。 google.code.linkedinapi.schema“不包含ObjectFactory.class或jaxb.in​​dex'。我想知道你是否处理了它,以及你是如何通过它的? – 2012-04-09 02:36:23

+0

你从这里http://code.google.com/p/linkedin-j/downloads/list得到了哪个zip?应该获得linkedin-j-1.0.415-binary.zip或1.0.429测试版二进制文件。从那里获取所有JAR,并将它们放在服务器上的位置(取决于安装方式,通常在#server.ColdFusion.ROOTDIR#\ lib \中)。然后你需要重新启动CF.从你发布的错误看来,其中一个JAR缺失。 – Lucas 2012-04-10 09:45:32

+0

我实际上使用JavaLoader,并且必须重新编译linkedin-j JAR以包含一些特殊的事情,以便JAXB正常工作。它在问题页面的问题#53中。 – 2012-04-10 15:44:21