Sinatra - API - 身份验证

Sai*_*aim 58 authentication api sinatra

我们将在Sinatra开发一个小API应用程序.有哪些身份验证选项可用于保护API调用?

Tod*_*ell 88

Sinatra没有内置的身份验证支持.有一些宝石可用,但大多数都是为用户身份验证(即网站)而设计的.对于API,它们看起来有点矫枉过正.制作自己的东西很容易.只需检查每个路由中的请求参数,看它们是否包含有效的API密钥,如果没有,则返回401错误.

helpers do
  def valid_key? (key)
    false
  end
end

get "/" do
  error 401 unless valid_key?(params[:key])

  "Hello, world."
end

#  $ irb -r open-uri
#  >> open("http://yourapp.com/api/?key=123")
#  OpenURI::HTTPError: 401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

error如果您的valid_key?方法返回false,则在调用之后不会发生任何事情-  内部error调用halt,这会停止请求继续.

当然,在每条路线的开头重复检查并不理想.相反,您可以创建一个小扩展,为您的路线添加条件:

class App < Sinatra::Base
  register do
    def check (name)
      condition do
        error 401 unless send(name) == true
      end
    end
  end

  helpers do
    def valid_key?
      params[:key].to_i % 2 > 0
    end
  end

  get "/", :check => :valid_key? do
    [1, 2, 3].to_json
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您只想在所有路由上进行身份验证,请使用before处理程序:

before do
  error 401 unless params[:key] =~ /^xyz/
end

get "/" do
  {"e" => mc**2}.to_json
end
Run Code Online (Sandbox Code Playgroud)

  • Todd Yandell,非常感谢你详细的回答以及你花在它上面的时间.我真的很感激.这真的很有帮助.伊姆兰 (7认同)