我正在使用 Grape gem 为我的应用程序创建 API。一切正常,直到我将 http 基本身份验证添加到葡萄 api 中内置的 api 中。
这是我拥有的代码:
require 'grape'
module MyApp
class API < Grape::API
prefix 'api'
version 'v1'
helpers do
def current_user
@current_user ||= User.authenticate(env)
end
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
end
resources :projects do
http_basic do |u,p|
authenticate! #=> Results in undefined method `authenticate!' for MyApp::API:Class (NoMethodError)
error! "401 Unauthorized", 401
!current_user.nil?
end
end
end
end
似乎我无法访问 http_basic 块中的任何方法或对象,包括请求、环境、helpers 方法中的任何内容,甚至错误!。
查看代码,这没有意义。
有没有人遇到过这个?有没有人有使用 Grape API 和 http 基本身份验证的例子?网络上的例子不是现实世界的例子。
最佳答案
Grape 将您的 http_basic 块作为 proc 存储在其设置哈希中。 build_endpoint
中的 Grape::API
方法将所有这些组合成这样:
Rack::Builder.new.use Rack::Auth::Basic, "API Authorization", &your_block
您的助手此时不可用。 (见 https://github.com/intridea/grape/blob/master/lib/grape/api.rb#L258 )
您可以尝试在没有帮助程序的情况下实现这一点,方法是在您的
User
模型中使用类方法,如下所示:http_basic do |user, password|
User.authenticate(user, password)
end
如果
User
也不可用,请使用上一行中的 Rack::Builder
实现您自己的基本身份验证。