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。
Lucas,我开始使用linkedin-j来实现我的API连接器,但是一旦我完成OAuth实现并转移到API方法中,我就不断收到此错误:' javax.xml.bind.JAXBException:“com。 google.code.linkedinapi.schema“不包含ObjectFactory.class或jaxb.index'。我想知道你是否处理了它,以及你是如何通过它的? – 2012-04-09 02:36:23
你从这里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
我实际上使用JavaLoader,并且必须重新编译linkedin-j JAR以包含一些特殊的事情,以便JAXB正常工作。它在问题页面的问题#53中。 – 2012-04-10 15:44:21