Sinatra – API – 身份validation

我们将在Sinatra开发一个小的API应用程序。 什么是可用于保护API调用的身份validation选项?

Sinatra没有内置的authentication支持。 有一些gem可用,但大多数都是为用户authentication而devise的(即为一个网站)。 对于一个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 

如果你的valid_key?调用error会发生valid_key? 方法返回false – error调用在内部halt ,这将停止请求继续。

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

 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 

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

 before do error 401 unless params[:key] =~ /^xyz/ end get "/" do {"e" => mc**2}.to_json end 

http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/有一个稍微更详细的答案,使用用户令牌。;

这比API密钥更复杂一步,但是如果您的API需要身份validation来login用户来执行诸如编辑名称/电子邮件/密码或访问每个用户的信息,则这是必要的。 (即“私人”的API行动)。 您还可以撤消/终止用户令牌,让用户注销等。

 class App < Sinatra::Base before do begin if request.body.read(1) request.body.rewind @request_payload = JSON.parse request.body.read, { symbolize_names: true } end rescue JSON::ParserError => e request.body.rewind puts "The body #{request.body.read} was not JSON" end end post '/login' do params = @request_payload[:user] user = User.find(email: params[:email]) if user.password == params[:password] #compare the hash to the string; magic #log the user in else #tell the user they aren't logged in end end end 

(值得注意的是,从HTTP标头而不是JSON体读取凭证更为常见,但作者提到了这一点)。