首页 文章

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

提问于
浏览
6

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

在以下these directions中,我能够成功生成 oauth_token 以在授权请求中使用,格式为:

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轻松地将令牌转储为浏览器中的查询字符串参数,并查看LinkedIn权限对话框 .

使用有效令牌显示的LinkedIn auth窗口:
enter image description here

不幸的是,当尝试在命令行中编写curl请求时,生成的 oauth_token 在同一个url中使用时会失败 . 实际上,它导致linkedin以500错误响应,并且浏览器显示标准500错误窗口 . 响应没有附加细节:

500 error

这里的代码类似于我在我的curl请求中为新 oauth_token 的linkedin实现的代码:

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}"'

值得注意的是,我曾使用LinkedIn's OAuth test console来生成Authorization标头 .

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

然而,我的主要问题是为什么在世界上我可以用上面的ruby代码来做,但是当使用简单的curl shell命令时,令牌似乎没有有效生成(或LinkedIn根本不想尊重它) ...

1 回答

  • 5

    像往常一样,魔鬼是最微小的细节 .

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

    事实证明,当我回顾我的代码并弄乱 oauth_callback Authorization标头参数来反向工程时,我通过监视成功的ruby请求发现了我试图从curl和meteor发出请求的不同问题 . 问题 .

    这些问题中的任何一个或组合都会导致生成无效且无法识别的oauth令牌 . 不会返回401,而是生成令牌!唉,这个令牌毫无用处 .

    以下是2个不同的请求授权标头,这些标头失败(每个请求授权标头):

    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_callback param有一个格式错误的查询字符串参数 . 事实证明,如 ?close=true 那样,如 ?close 那样没有值的查询字符串参数会导致请求完全满足 . 我仍然不知道为什么,但似乎是这种情况 .

    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_callback 在其域中具有 localhost . 事实证明,某些oauth提供者,其中一个是,不喜欢 oauth_callback param中的主机名(与FQDN或IP地址相对) . 打败我为什么 . 我们需要使用 127.0.0.1 . 没有充分的理由,但它只是 is . 瘸子,但是真的 .

    This one works:

    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_consumer_keyoauth_signature 值,这显然是为了保护我的密钥并消除对我的秘密进行逆向工程的可能性 .

相关问题