作为我正在构建的API的一部分,有一种用户认证方法,成功后,返回有用的用户信息,API令牌等的有效载荷.
在编写处理这个的控制器的功能测试时,我正在运行一个测试HTTP Basic认证的问题;我发现许多博客提到以下代码应该用于欺骗头来进行身份验证尝试:
@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(email,pass)
问题是这没有效果; authenticate_with_http_basic没有看到标题,因此即使存在有效的凭据也返回false.
我错过了什么吗?
请注意,如果应用程序在回答中很有用,则该应用程序将冻结到Rails 2.2.2.
解决方法
我不知道这是否有帮助,但我只是在自己的应用程序中进行了其中一个测试,除了我使用的是Rails 2.3.2.
在我的情况下,这个陷阱是我已经忘记为用户安装了固定装置,所以crypted_password不匹配(为什么它有任何价值对我来说依然是一个谜…我猜Rails没有清理测试数据库运行前的测试?)
class DonglesControllerTest < ActionController::TestCase fixtures :users test "index api" do @request.env['HTTP_AUTHORIZATION'] = encode_credentials('one','one') get(:index,{ :name_contains => 'XXXX0001',:format => 'json' }) assert_equal 'application/json',@response.content_type dongles = ActiveResource::Formats::JsonFormat.decode(@response.body) expected_dongles = [ { 'id' => 1,'name' => 'XXXX0001','key_id' => 'usbstor\disk&ven_flash&prod_drive_sm_usb20&rev_1100\0000000000000000&0' } ] assert_equal expected_dongles,dongles end private # verbatim,from ActiveController's own unit tests def encode_credentials(username,password) "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}" end end