在测试 LinkedIn API 并尝试构建 Meteor JS 智能包以针对 LinkedIn 的 OAuth 提供者进行身份验证时,我遇到了一个完全障碍。
按照这些指示,我能够成功地生成一个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 身份验证窗口:
不幸的是,当尝试在命令行中编写 curl 请求时,oauth_token
生成的请求在同一个 url 中使用时会失败。实际上,它会导致linkedin 响应500 错误,并且浏览器会显示标准的500 错误窗口。该响应没有其他详细信息:
这是类似于我在 curl 请求中实现的代码,以获取 new oauth_token
:
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 的 OAuth 测试控制台来生成 Authorization 标头。
这很重要,因为我在尝试在 Meteor JS 智能包中实现类似功能时遇到了同样的问题。
然而,我的主要问题是,为什么我可以用上面的 ruby 代码做到这一点,但是当使用简单的 curl shell 命令时,令牌似乎没有有效生成(或者 LinkedIn 根本不想兑现它) ...