我在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-token
和curl
的文档似乎还不是特别有用,在检查请求对象时搜索ActionDispatch::Request
没有任何结果。 SO中的其他主题似乎主要是关于如何让my-api-token
首先工作,而不是这个特定的用例。
我做错了什么?或者,或许更好的是,我需要采取哪些不同的方式才能使其发挥作用?
提前致谢。
答案 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