Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Grape从BasicAuth获取用户名:密码_Ruby_Basic Authentication_Grape_Rails Api - Fatal编程技术网

Ruby Grape从BasicAuth获取用户名:密码

Ruby Grape从BasicAuth获取用户名:密码,ruby,basic-authentication,grape,rails-api,Ruby,Basic Authentication,Grape,Rails Api,我开始构建一个非常小的API,我需要验证一些端点,而不是所有端点。我希望能够选择使用身份验证强制进行身份验证的端点要在“路由”主体中调用的方法 例如: resource :groups do desc 'List all groups.' get do authenticate! { groups: "list of groups v1"} end end 我有这个工作。我使用了一个助手,在那里我使用:request.env[“HTTP\u AU

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

例如:

resource :groups do
    desc 'List all groups.'
    get do
      authenticate!
      { groups: "list of groups v1"}
    end
end
我有这个工作。我使用了一个助手,在那里我使用:
request.env[“HTTP\u AUTHORIZATION”]
从报头手动获取base64编码的数据。我对数据进行解码,并对照数据库检查用户和密码是否属于注册用户。这很好,但我想使用Grape的助手来避免所有base64解码等:

http_basic do |username, password|
end
我的想法是,该方法始终返回true,将用户名和密码分配给@username和@password,并有一个助手来获取这些变量并检查数据库。这一切都很好,问题是,对于不需要身份验证的路由,由于“授权”标题为空,会出现询问密码的弹出窗口,我希望避免这种情况。有没有办法使用助手来完成我想做的事情

顺便说一句:我使用的是安装在rails上的grape api


谢谢

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

好的,如果我没有弄错,您不希望出现用户名/密码框,而是在代码中决定是否确实需要身份验证信息

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
中。您可以只包含或引用此身份验证策略中的逻辑


尽管如此,我还是希望像Eric已经提到的那样,将API分成两部分。

谢谢您的评论。但我的问题更倾向于使用http_basic方法来解码授权头,而不是像我这样手动执行。