`
花花公子
  • 浏览: 132057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

让ActiveResource使用HTTP Digest验证

阅读更多
ActiveResource可以使用HTTP Basic验证方式,如果ActiveResource可以使用Digest验证方式,那么就不需要https安全连接访问资源了。这样一方面服务器配置简单,另一方面,速度上更有优势。
在服务器端,我们使用了httpauth这个库实现了服务器端的HTTP Digest验证,具体实现请gem install httpauth后查看examples中的两个文件。客户端如果不需要ActiveResource的功能,直接参考httpauth例子就可以实现。
ActiveResource对于HTTP Digest的验证的支持我参考了日本人taslamBasic認証以外に対応させる里面对于WSSE支持的实现。同样重新构造connection,并对于401的第一次失败作重新处理。这里不能使用ruby的http库,而需要使用mongrel作者Zed Shaw编写的全功能http client库rfuzz

taslam对于ActiveResource的功底非常深厚,还有一篇文章,讲到如何提高ActiveResource处理数据的速度。ActiveResourceが遅い→JSONならパースが速いよ

下面是activerecord 支持http digest authentication需要的代码和model示例。
AuthenticationCache代码来自于httpauth的例子程序,为节省篇幅就不再附上。
#lib/active_resource/digest.rb
require 'httpauth'
require 'rfuzz/client'
require 'authentication_cache'

module ActiveResource

  class Connection::Digest < Connection
    include HTTPAuth::Digest

    def initialize(site, format = ActiveResource::Formats[:xml])
      super
      @cache = AuthenticationCache.new
    end

    def site=(site)
      super
      @client = RFuzz::HttpClient.new @site.host, @site.port
    end

    private
    def authorization_header
      {}
    end

    def request(method, path, *arguments)
      RFuzz::HttpResponse.send(:define_method, :code, Proc.new(){ self.http_status })
      RFuzz::HttpResponse.send(:define_method, :body, Proc.new(){ self.http_body })

      args = {}
      args[:head] = arguments.pop
      args[:body] = arguments.pop

      uri = URI.parse path

      # If credentials were stored, use them. Otherwise do a normal get
      credentials = @cache.get_credentials
      if credentials
        args[:head].update({"Authorization" => credentials.to_header})
      end

      result = nil
      time = Benchmark.realtime { result = @client.send(method, path, args) }
      if result.http_status == '401' and !result['WWW_AUTHENTICATE'].nil?
        challenge = Challenge.from_header(result['WWW_AUTHENTICATE'])
        (stale = challenge.stale) rescue NoMethodError
        unless stale
          username, password = site.user, site.password
        else
          username = credentials.username
          password = credentials.password
        end

        credentials = Credentials.from_challenge(
          challenge,
          {:uri => path, :username => username, :password => password, :method => method.to_s.upcase }
        )
        args[:head].update({"Authorization" => credentials.to_header})
        @cache.set_credentials_for uri.path, credentials
        time = Benchmark.realtime { result = @client.send(method, path, args) }
      end

      if @cache.get_credentials
        if result['AUTHENTICATION_INFO']
          auth_info = AuthenticationInfo.from_header(result['AUTHENTICATION_INFO'])
          @cache.update_usage_for uri.path, auth_info.h[:nextnonce]
        else
          @cache.update_usage_for uri.path
        end
      end

      handle_response(result)
    rescue Timeout::Error => e
      raise TimeoutError.new(e.message)
    end
  end

  class Digest < Base
    def self.connection(refresh = false)
      @connection = Connection::Digest.new(site, format) if refresh || @connection.nil?
      @connection
    end
  end
end

class UserResource < ActiveResource::Digest
  self.site = "http://user:pass@localhost:3000"
  self.element_name = "user"
  self.format = :ex_json
end

同时我发现rails 2.1新生成的new_default需要修改,否则json格式解析不会正确生成ActiveResource对象,我在这里也花了好长时间,因为我以为是json lib解析的问题。
if defined?(ActiveRecord)
  # 原先为true,要改成false。
  ActiveRecord::Base.include_root_in_json = false 
end
分享到:
评论
1 楼 blackanger 2008-10-31  
我想问一下,activeresource不是消费rest webservice的吗?你的web service也是Digest验证方式 ?

相关推荐

    模拟Digest认证的登录demo

    首先,HTTP 401 Unauthorized是HTTP状态码之一,表示客户端在尝试访问受保护的资源时没有提供有效的身份验证凭证。服务器返回401响应时,通常会包含一个WWW-Authenticate头,指示客户端应该使用哪种类型的认证机制,...

    RFC 2617中文版(HTTP Digest Authentication)

    RFC 2617中文版是对HTTP Digest Authentication的描述,该文档基于原英文版进行了校正和重新排版,以方便中文读者更好地理解和使用HTTP Digest Authentication机制。 摘要鉴别方案是HTTP Digest Authentication的...

    Http Digest 鉴权

    “摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的...

    digest 用户认证 response生成算法

    在网络安全认证领域,digest用户认证是一种使用摘要算法对用户凭证进行加密验证的技术,它允许在不安全的网络通道中安全地进行身份验证。digest认证机制通常用于基于HTTP和SIP(Session Initiation Protocol)协议的...

    HTTP digest RFC2671规范 加密实现(JAVA)

    HTTP Digest认证是一种安全的身份验证机制,它在HTTP协议中用于保护服务器资源免受未经授权的访问。RFC2671是HTTP/1.1扩展中关于Digest认证的规范,旨在改进基本认证的安全性,因为它不直接在请求中传输明文密码。在...

    Onvif编译及开发(带wsse鉴权和digest鉴权)

    本教程将深入探讨如何进行ONVIF编译与开发,包括使用gSOAP工具处理SOAP消息,以及实现WSSE(Web Services Security Extensions,Web服务安全扩展)和DIGEST鉴权机制。 首先,让我们了解gSOAP。gSOAP是一个开源C和...

    http_digex:HTTP Digest Auth库创建与HTTP Digest身份验证一起使用的auth标头

    HTTP Digest Auth库创建与HTTP Digest身份验证一起使用的auth标头 安装 您可以通过以下方式从十六进制安装此软件包: def deps do [{ :http_digex , " ~&gt; 0.0.1 " }] end 或者,您可以选择从github安装,如下所...

    Digest-HMAC-1.03.tar.gz

    在HTTP Digest认证中,用户的身份通过一个基于密码的非对称哈希过程来验证,而Digest-HMAC在此基础上增加了基于密钥的HMAC计算,提供了更强大的认证功能。在Digest-HMAC 1.03版本中,这一特性得到了进一步的优化和...

    go-http-auth:golang http的基本和摘要HTTP身份验证

    Go中的HTTP身份验证实现这是Go语言中HTTP Basic和HTTP Digest身份验证的实现。 它被设计为http.RequestHandler函数的简单包装。特征支持HTTP基本和HTTP摘要身份验证。 支持htpasswd和htdigest格式的文件。 自动重新...

    MD5 digest 算法

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Ronald Rivest在1991年设计。它能够将任意长度的数据转化为一个固定长度的摘要值,通常是一个128位的二进制数,通常用32个十六进制数字...

    Go-httpauth-Go的HTTP身份验证中间件

    在Go语言的Web开发中,安全性和访问控制是不可或缺的部分,`Go-httpauth`就是一款专为Go设计的HTTP身份验证中间件。这个中间件使得开发者可以轻松地为他们的Web应用添加基本的身份验证机制,从而保护敏感的API接口...

    Digest-Perl-MD5-1.9.tar.gz

    总的来说,Digest-Perl-MD5为Perl开发者提供了一个强大且方便的工具,用于处理MD5哈希运算,无论是在数据验证、日志分析还是其它需要散列计算的场景中,都能发挥重要作用。然而,鉴于MD5的安全性问题,对于安全敏感...

    Laravel开发-digest-auth

    让我们一起了解如何在Laravel项目中集成和使用Digest Authentication。 摘要式身份验证是一种非对称的身份验证方法,它不直接在客户端和服务器之间传输密码,而是通过哈希算法处理数据,以减少敏感信息在网络中被...

    express-3.x-http-digest-example:使用Passport的Express 3.x应用通过HTTP摘要方案进行身份验证

    本示例演示如何使用 3.x和通过HTTP Digest方案对用户进行身份验证。 使用此示例作为您自己的Web应用程序的起点。 指示 要在您的计算机上安装此示例,请克隆存储库并安装依赖项。 $ git clone git@github....

    express-3.x-http-basic-and-digest-example:Express 3.x应用程序使用Passport通过HTTP Basic和Digest方案进行身份验证

    本示例演示如何使用 3.x和通过HTTP Basic或HTTP Digest方案对用户进行身份验证。 使用此示例作为您自己的Web应用程序的起点。 指示 要在您的计算机上安装此示例,请克隆存储库并安装依赖项。 $ git clone git@...

    http-client-digest_auth:针对Crystal的RFC 2617摘要访问身份验证的实现

    HTTP客户端摘要认证(Digest Authentication)作为一种安全的身份验证机制,广泛应用于各种Web服务和API中。本篇将详细介绍如何在Crystal编程语言中实现RFC 2617规范的摘要认证,并探讨其工作原理。 摘要认证,基于...

    okhttp-digest:okhttp的摘要身份验证器

    okhttp-digest okhttp的摘要身份验证器。 大多数代码是从Apache Http Client移植的。重要的该工件已从jcenter转移到了Maven Central! 坐标已从com.burgstaller:okhttp-digest:&lt;version&gt;到io.github.rburgst:okhttp-...

    t-digest-3.2-API文档-中英对照版.zip

    赠送jar包:t-digest-3.2.jar; 赠送原API文档:t-digest-3.2-javadoc.jar; 赠送源代码:t-digest-3.2-sources.jar; 赠送Maven依赖信息文件:t-digest-3.2.pom; 包含翻译后的API文档:t-digest-3.2-javadoc-API...

    Qt Digest Auth身份验证 海康摄像头的ISAPI协议操作

    Qt Digest Auth身份验证 海康摄像头的ISAPI协议操作

Global site tag (gtag.js) - Google Analytics