我正在使用 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 实现您自己的基本身份验证。

10-08 04:23