在Sinatra中使用标头进行身份验证

时间:2018-12-21 10:46:54

标签: ruby authentication http-headers sinatra

如果其中一个标头不匹配,如何在sinatra中比较标头并暂停代码/脚本?

假设我有一个标题为TOKEN: 666的标题 我想比较对sinatra发出的任何请求,并检查“令牌”是否存在并等于“ 666”,然后继续执行代码,如果不只是返回401。

1 个答案:

答案 0 :(得分:0)

答案很简单:

默认情况下,Sinatra侦听端口4567,因此我只是确保将其绑定到所有接口,以防万一我想从其外部IP地址调用它并禁用任何详细的错误输出,如下所示:

listener.rb

require "sinatra"

set :bind, "0.0.0.0"
disable :show_exceptions
disable :raise_errors

post "/" do

  # Check if the header matches
  # If it did not match then halt and return code 401 Unauthorized

  if request.env["HTTP_custom_header_name"] != "verystrongpassword"
    halt 401
  end

  #the rest of your code goes here

  status :ok

end

请注意,比较标头值时,必须始终包含 HTTP ,然后加上标头名称-Link

示例

require "sinatra"

set :bind, "0.0.0.0"
disable :show_exceptions
disable :raise_errors

post "/" do

  # Check if the header matches
  # If it did not match then halt and return code 401 Unauthorized

  if request.env["HTTP_X_GIT_SECRET"] != "d4c74594d841139328695756648b6bd6"
    halt 401
  end

  data = JSON.parse request.body.read
  p data

  status :ok

end

其中 X_GIT_SECRET 是标题名称

额外

如果您不知道发送给sinatra的标头的名称是什么,则可以通过在if语句之前放置以下 来检查所有请求内容。上

p request.env

,然后尝试再次发送请求,找到您的标头并根据该标头进行比较。

注意:status :ok也就是200 OK,是在该块的末尾设置的,因为当有人向sinatra发送请求时,它应该返回某些内容,否则会发生500个内部服务器错误。