为什么我不能为LinkedIn API使用命令行curl生成有效的oauth令牌?

为什么我不能为LinkedIn API使用命令行curl生成有效的oauth令牌?,curl,oauth,meteor,linkedin,Curl,Oauth,Meteor,Linkedin,在测试LinkedIn API并尝试构建Meteor JS智能包以针对LinkedIn的OAuth提供商进行身份验证时,我遇到了一个完全的障碍 在下面,我能够成功地生成一个oauth_令牌,用于授权请求,形式如下: https://www.linkedin.com/uas/oauth/authorize?oauth_token={oauth_token} 当使用ruby脚本生成的令牌将其放入浏览器时,如下所示: require 'oauth' api_key = '{linkedin api

在测试LinkedIn API并尝试构建Meteor JS智能包以针对LinkedIn的OAuth提供商进行身份验证时,我遇到了一个完全的障碍

在下面,我能够成功地生成一个
oauth_令牌
,用于授权请求,形式如下:

https://www.linkedin.com/uas/oauth/authorize?oauth_token={oauth_token}
当使用ruby脚本生成的令牌将其放入浏览器时,如下所示:

require 'oauth'

api_key = '{linkedin api key}'
api_secret = '{linkedin api secret}'

configuration = { :site => 'https://api.linkedin.com',
                          :authorize_path => '/uas/oauth/authenticate',
                          :request_token_path => '/uas/oauth/requestToken',
                          :access_token_path => '/uas/oauth/accessToken' }

consumer = OAuth::Consumer.new(api_key, api_secret, configuration)

request_token = consumer.get_request_token
puts request_token.params[:oauth_token]
然后,我可以使用上面的URI在浏览器中轻松地将令牌作为querystring参数转储,并查看LinkedIn权限对话框

使用有效令牌显示的LinkedIn身份验证窗口:

不幸的是,当试图在命令行中写入curl请求时,生成的
oauth_令牌
在同一url中使用时失败。事实上,它会导致linkedin出现500错误,浏览器显示标准的500错误窗口。答复中没有其他细节:

下面的代码与我向linkedin提交的新
oauth_令牌的curl请求中实现的代码类似:

alex@alex-mac accounts-linkedin (fixes_for_meteor_0_5_4)* $ cat linkedin_oauth_gen.sh 

curl -X POST https://api.linkedin.com/uas/oauth/requestToken --verbose --header 'Authorization: OAuth oauth_nonce="0d9a3e40660811e2bcfd0800200c9a66",oauth_timestamp="1359019570",oauth_version="1.0",oauth_signature_method="HMAC-SHA1",oauth_consumer_key="{oauth_consumer_key}",oauth_signature="{oauth_signature}"'
值得注意的是,我曾用于生成授权标头

这一点很重要,因为我在Meteor JS智能包中尝试实现类似功能时遇到了同样的问题


然而,我的主要问题是,为什么我可以用上面的ruby代码来实现这一点,但是当使用一个简单的curl shell命令时,令牌似乎并没有被有效地生成(或者LinkedIn根本不想尊重它).

像往常一样,魔鬼就在最微小的细节中

在解决这个问题时,我使用了EverWonder来监视我的ruby脚本通过oauth库发出的请求

事实证明,我如何尝试从curl和meteor发出请求存在两个不同的问题,我发现了这两个问题,通过监视成功的ruby请求,同时回顾我的代码,并使用
oauth\u回调
授权头参数对问题进行反向工程

这些问题中的任何一个或组合都会导致生成无效且无法识别的oauth令牌。linkedin没有返回401,而是生成了一个令牌!唉,这个代币没用了

以下是失败的两个不同的请求授权标头(每个标头后面都有原因):

在第一个示例中,问题是
oauth_回调
param的querystring参数格式不正确。事实证明,如果查询字符串param(如
?close
)没有值,如
?close=true
,则会导致请求完全失效。我仍然不知道确切的原因,但似乎是这样的

Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2Flocalhost%3A3000%2F_oauth%2Flinkedin%3Fclose", oauth_consumer_key="*********", oauth_nonce="SJ3DSTHLh0T4UcqzYOUOqubIeWN9FERCePm5ro35EY", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359081520", oauth_version="1.0"
在第二个示例中,问题是,
oauth\u callback
在其域中有
localhost
。事实证明,一些oauth提供者(linkedin就是其中之一)不喜欢
oauth\u回调中的主机名(vs FQDN或IP地址)。我不明白为什么。我们需要使用
127.0.0.1
。没有充分的理由,但它只是。站不住脚,但却是真的

这个有效:

Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2F127.0.0.1%3A3000%2F_oauth%2Flinkedin%3Fclose%3Dtrue%26state%3D0e314d0d-a5ca-40ca-8fcd-caa1cfce3ed4", oauth_consumer_key="*********", oauth_nonce="0KBnMSMI8NNk1cXn0YyTRpUnPdnqAX7F06KEloh9bs", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359082177", oauth_version="1.0"

注意:我已经用
*********
值替换了
oauth_消费者_密钥
oauth_签名
值,这显然是为了保护我的密钥和消除对我的秘密进行反向工程的可能性。

FWIW,我已经详细阅读了这篇文章:我还在linkedin开发者论坛上发现了这条线索:
Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2F127.0.0.1%3A3000%2F_oauth%2Flinkedin%3Fclose%3Dtrue%26state%3D0e314d0d-a5ca-40ca-8fcd-caa1cfce3ed4", oauth_consumer_key="*********", oauth_nonce="0KBnMSMI8NNk1cXn0YyTRpUnPdnqAX7F06KEloh9bs", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359082177", oauth_version="1.0"