ActiveResource可以使用HTTP Basic验证方式,如果ActiveResource可以使用Digest验证方式,那么就不需要https安全连接访问资源了。这样一方面服务器配置简单,另一方面,速度上更有优势。
在服务器端,我们使用了
httpauth这个库实现了服务器端的HTTP Digest验证,具体实现请gem install httpauth后查看examples中的两个文件。客户端如果不需要ActiveResource的功能,直接参考httpauth例子就可以实现。
ActiveResource对于HTTP Digest的验证的支持我参考了日本人
taslam的
Basic認証以外に対応させる里面对于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
分享到:
- 2008-10-24 00:04
- 浏览 1548
- 评论(1)
- 论坛回复 / 浏览 (1 / 4290)
- 查看更多
相关推荐
首先,HTTP 401 Unauthorized是HTTP状态码之一,表示客户端在尝试访问受保护的资源时没有提供有效的身份验证凭证。服务器返回401响应时,通常会包含一个WWW-Authenticate头,指示客户端应该使用哪种类型的认证机制,...
RFC 2617中文版是对HTTP Digest Authentication的描述,该文档基于原英文版进行了校正和重新排版,以方便中文读者更好地理解和使用HTTP Digest Authentication机制。 摘要鉴别方案是HTTP Digest Authentication的...
“摘要”式认证( Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份验证机制很简单,它采用杂凑式(hash)加密方法,以避免用明文传输用户的...
在网络安全认证领域,digest用户认证是一种使用摘要算法对用户凭证进行加密验证的技术,它允许在不安全的网络通道中安全地进行身份验证。digest认证机制通常用于基于HTTP和SIP(Session Initiation Protocol)协议的...
HTTP Digest认证是一种安全的身份验证机制,它在HTTP协议中用于保护服务器资源免受未经授权的访问。RFC2671是HTTP/1.1扩展中关于Digest认证的规范,旨在改进基本认证的安全性,因为它不直接在请求中传输明文密码。在...
本教程将深入探讨如何进行ONVIF编译与开发,包括使用gSOAP工具处理SOAP消息,以及实现WSSE(Web Services Security Extensions,Web服务安全扩展)和DIGEST鉴权机制。 首先,让我们了解gSOAP。gSOAP是一个开源C和...
HTTP Digest Auth库创建与HTTP Digest身份验证一起使用的auth标头 安装 您可以通过以下方式从十六进制安装此软件包: def deps do [{ :http_digex , " ~> 0.0.1 " }] end 或者,您可以选择从github安装,如下所...
在HTTP Digest认证中,用户的身份通过一个基于密码的非对称哈希过程来验证,而Digest-HMAC在此基础上增加了基于密钥的HMAC计算,提供了更强大的认证功能。在Digest-HMAC 1.03版本中,这一特性得到了进一步的优化和...
Go中的HTTP身份验证实现这是Go语言中HTTP Basic和HTTP Digest身份验证的实现。 它被设计为http.RequestHandler函数的简单包装。特征支持HTTP基本和HTTP摘要身份验证。 支持htpasswd和htdigest格式的文件。 自动重新...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Ronald Rivest在1991年设计。它能够将任意长度的数据转化为一个固定长度的摘要值,通常是一个128位的二进制数,通常用32个十六进制数字...
在Go语言的Web开发中,安全性和访问控制是不可或缺的部分,`Go-httpauth`就是一款专为Go设计的HTTP身份验证中间件。这个中间件使得开发者可以轻松地为他们的Web应用添加基本的身份验证机制,从而保护敏感的API接口...
总的来说,Digest-Perl-MD5为Perl开发者提供了一个强大且方便的工具,用于处理MD5哈希运算,无论是在数据验证、日志分析还是其它需要散列计算的场景中,都能发挥重要作用。然而,鉴于MD5的安全性问题,对于安全敏感...
让我们一起了解如何在Laravel项目中集成和使用Digest Authentication。 摘要式身份验证是一种非对称的身份验证方法,它不直接在客户端和服务器之间传输密码,而是通过哈希算法处理数据,以减少敏感信息在网络中被...
本示例演示如何使用 3.x和通过HTTP Digest方案对用户进行身份验证。 使用此示例作为您自己的Web应用程序的起点。 指示 要在您的计算机上安装此示例,请克隆存储库并安装依赖项。 $ git clone git@github....
本示例演示如何使用 3.x和通过HTTP Basic或HTTP Digest方案对用户进行身份验证。 使用此示例作为您自己的Web应用程序的起点。 指示 要在您的计算机上安装此示例,请克隆存储库并安装依赖项。 $ git clone git@...
HTTP客户端摘要认证(Digest Authentication)作为一种安全的身份验证机制,广泛应用于各种Web服务和API中。本篇将详细介绍如何在Crystal编程语言中实现RFC 2617规范的摘要认证,并探讨其工作原理。 摘要认证,基于...
okhttp-digest okhttp的摘要身份验证器。 大多数代码是从Apache Http Client移植的。重要的该工件已从jcenter转移到了Maven Central! 坐标已从com.burgstaller:okhttp-digest:<version>到io.github.rburgst:okhttp-...
赠送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协议操作