在对Rails应用程序发出的请求中访问curl -u提供的用户名

时间:2016-10-20 17:22:12

标签: ruby-on-rails api curl

我在Rails 5中重写了一个遗留的JSON API应用程序(在API模式下,所以我们使用的是ActionController :: API)。为了API的一致性,需要像下面那样访问新的应用程序:

$ curl -u my-api-token: http://foo.bar/baz

(请注意,未提供密码)。

从那里,我们表面上基于API令牌进行身份验证,生命是宏伟的。

我遇到的问题是我无法使用控制器中的Rails'my-api-token对象(request对象)或{通过{来访问请求的ActionDispatch::Request组件{1}}哈希 - 在任何一种情况下,params似乎都不存在。卷曲的行为是成功的,因为它击中了正确的终点和正确的控制器动作。

my-api-tokencurl的文档似乎还不是特别有用,在检查请求对象时搜索ActionDispatch::Request没有任何结果。 SO中的其他主题似乎主要是关于如何让my-api-token首先工作,而不是这个特定的用例。

我做错了什么?或者,或许更好的是,我需要采取哪些不同的方式才能使其发挥作用?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您似乎误解了-u选项在cURL中的作用。使用-u选项,您告诉cURL使用基本身份验证。因此,您的API令牌将在HTTP Authorization标头中发送,而不是在请求参数中发送。

我看到了一些解决问题的方法。

第一个选项是查看请求标头以提取Authorization标头值,base64对其进行解码,然后您可以获取API令牌。我对Rails不是很熟悉,但看起来这很容易做到:http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-headers

第二个选项是通过GET参数或POST请求发送API令牌。我认为使用POST请求最常见的是身份验证。

例如,使用POST请求,您可能会执行类似

的操作

curl --data "token=API_TOKEN" https://example.com/resource.cgi

然后您应该能够访问请求参数中的数据。

另外,请考虑使用HTTPS。使用HTTP,我提到的任何解决方案都容易被截获的API令牌。您可以阅读此问题以了解其原因:https://superuser.com/questions/919859/is-curl-u-usernamepassword-http-example-com-secure