-1

我有一个使用 http 基本身份验证保护的站点。

我希望编写一个 ruby​​ 代码片段,它允许我通过 http 基本身份验证并读取网页的内容。

我在 java 中使用了一种方法来发送在 HTTP 标头中设置的密钥和其他详细信息,从而读取网页的内容。但无法在红宝石中找到相同的东西。

编辑:

我使用的代码在这里:

   def express
    http_basic_authenticate_with :name => "dhh", :password => "secret"
   end

这给了我错误:

undefined method `http_basic_authenticate_with' for #<ServiceController:0x7f9bd73e5448>

提前致谢。

4

3 回答 3

2

Devise确实内置了,HTTP Basic Authentication但您确实需要在您的应用程序中添加两个小东西才能使其正常工作:

:database_authenticatableconfig.http_authenticatable = true设计初始化程序中的用户/帐户模型中的策略

设计依赖Warden,这是一个用于身份验证的机架框架。就其本身而言,Warden尝试通过名为 failure_app 的东西(一个有效的机架应用程序)为所有未经身份验证的请求提供自定义响应。

一个执行http认证的简单代码如下:

def http_authenticate
  authenticate_or_request_with_http_digest do |user_name, password|
    user_name == "foo" && password == "bar"
  end
  warden.custom_failure! if performed?
end

还有一个很好的帖子。在这里检查。

另一种解决方案(替代方案)是使用Mechanize 库

    require 'rubygems'
    require 'mechanize'
    require 'logger'

    agent = WWW::Mechanize.new { |a| a.log = Logger.new("mech.log") }
    agent.user_agent_alias = 'Windows Mozilla'
    agent.auth('username', 'password')
    agent.get('http://example.com') do |page|
      puts page.title
    end
于 2013-01-17T09:48:40.627 回答
1

我认为这是您正在寻找的:

 class SecretController < ApplicationController
   http_basic_authenticate_with :name => "frodo", :password => "thering"
   def index
     ...
   end
 end

您还可以为任何特定传递异常action

 http_basic_authenticate_with :name => "dhh", :password => "secret", :except => :index

还有一个关于它的RailsCasts

编辑 - 如果您的 rails 版本早于 3.1,您可以创建自己的方法:

class ApplicationController < ActionController::Base
USER, PASSWORD = 'dhh', 'secret'

before_filter :authentication_check, :except => :index

...

 private
  def authentication_check
   authenticate_or_request_with_http_basic do |user, password|
    user == USER && password == PASSWORD
   end
  end
end 
于 2013-01-17T09:34:30.080 回答
1

使用诸如httparty 之类的 gem :

opt = {basic_auth: {username: "user123", password: "pass"}}
response = HTTParty.get("your_site", opt)
于 2013-01-17T09:38:10.627 回答