为什么我需要检查params和request.headers?

时间:2017-10-14 14:46:52

标签: ruby-on-rails

我在Rails控制器中有一个api方法,如下所示:

 def login
    if !request || !request.headers
      render :json => {:error => I18n.t('error_must_provide_api_key_or_token')}, :status => :unauthorized and return
    end

    api_key = params['X-Api-Key']

    if api_key.nil?
      api_key = request.headers['X-Api-Key']
    end

    ... rest of method ...

该方法首先检查我们是否有请求,以及该请求是否有标头。然后,我想要做的是检查名为X-Api-Key的标头变量。我首先检查params哈希值,如果找不到那个,我会检查request.headers哈希值。

我不明白为什么我必须检查这两个。以前,我有:

api_key = request.headers['X-Api-Key']

当我在本地计算机上进行调试时,这种方法有效,但是一旦我推送到生产服务器并在生产模式下运行,它就无法工作。相反,以下内容:

api_key = params['X-Api-Key']

当我推送到生产服务器时工作,但在本地运行时不起作用。

我的本​​地计算机正在运行MacOS,而rbenv 1.1.0正在运行ruby 2.4.0p0和rails 5.1.1。

我的服务器是Ubuntu 16.04并使用rails 4.2.5运行ruby 2.1.4p265。

1 个答案:

答案 0 :(得分:0)

  • 请求标头来自http标头。
  • 虽然params来自HTTP的主体(如果它不是GET方法),或者来自编码的url(例如:http://localhost:3000/cars?a=b之类的东西,那么params [:a]会给出'b')。< / LI>

例如(使用curl,-H代表标题)

使用为参数编码的url,

curl -H 'X-Api-Key: 1234' http://localhost:3000/cars?X-Api-Key=abc

或使用http请求正文,application/json作为内容类型。

curl -X GET -H 'X-Api-Key: 1234' -H "Content-Type: application/json" -d '{"X-Api-Key": "abc" }' http://localhost:3000/cars

  • 然后,request.headers['X-Api-Key]会返回1234
  • params['X-Api-Key']将返回abc

所以这里发生的事情可能是,在本地你通过http标头发送X-Api-Key,而在生产中你通过url编码或http请求体发送它作为json的内容类型。

要解决这个问题,

  • 如果您想支持两种方式,请提供X-Api-Key

    • 通过http标头
    • http编码了http体中的params或json params

    然后你上面写的内容有意义。

  • 如果您只想支持http标头,请更改生产客户端代码,通过http请求标头发送X-Api-Key。

  • 如果您只想支持参数,请更改本地代码,通过http请求正文或编码网址发送X-Api-Key。

相关问题