Grape从BasicAuth获取用户名:密码

时间:2015-03-19 18:33:48

标签: ruby basic-authentication grape rails-api

我开始构建一个非常小的API,我需要验证一些端点,而不是所有端点。我希望能够选择哪个端点强制使用authenticate!方法进行身份验证,以便在“路由”的主体中调用。

例如:

resource :groups do
    desc 'List all groups.'
    get do
      authenticate!
      { groups: "list of groups v1"}
    end
end

我有这个工作。我使用了一个帮助器,我使用:request.env["HTTP_AUTHORIZATION"]从头部手动获取base64编码数据。如果用户和机密属于注册用户,我会解码该数据并检查数据库。这工作正常,但我想使用Grape的帮助器来避免所有base64解码等等:

http_basic do |username, password|
end

我的想法是在内部,该方法总是返回true,为@username和@password分配用户名和密码,并有一个帮助程序来抓取这些变量并检查数据库。一切正常,问题是对于不需要身份验证的路由,因为“授权”标头为空,会出现要求输入密码的弹出窗口,我想避免这种情况。有没有办法使用帮助器来做我想做的事情?

BTW:我正在使用rails-api上的葡萄

谢谢!

2 个答案:

答案 0 :(得分:1)

好的,如果我做得对,你不希望出现用户名/密码框,而是在你的代码中决定你是否真的需要身份验证信息。

Grape本身使用默认的Rack::Auth::Basic类。如果您创建此类的自定义版本,您应该能够在调用方法的开头进行断言,甚至将任何其他变量传递给http_basic块。

然后,您可以通过以下方式将身份验证策略添加到Grape:

# Add authorization strategy to grape and replace default http_basic
Grape::Middleware::Auth::Strategies.add(:http_basic, Your::Namespace::CustomizedBasicAuth, ->(options) { [options[:realm]] })

这样,您也无需在@username@password中保存凭据。您可以在此身份验证策略中包含或引用逻辑。

尽管如此,我仍然倾向于将API分解为Eric已经提到的两个部分。

答案 1 :(得分:0)

您可以将Grape :: API分解为多个模块。将需要http_basic auth的模块组合在一起。将不需要http_basic auth的模块分组