Authlogic / OpenID身份验证失败使用Warp Drive

时间:2009-12-31 19:42:29

标签: ruby-on-rails openid rubygems authlogic

Warp Drive是将整个Rails应用程序打包到Gem中以便在其他Rails应用程序中使用的好方法。我已经让Warp Drive为我正在创建的博客引擎工作。只有一个问题 - Authlogic OpenID身份验证失败。

我创建了bare-bones OpenID example application。我可以编译成一个没有问题的宝石:

$ warpify
$ rake warp_drive:compile

然后我在我的系统上安装了已编译的gem。创建一个空白的Rails项目,我跑了:

$ install_warp_drive rails-openid

你可以get this project here

在我的空白Rails项目中,我需要通过environment.rb配置gems(我可能这样做的方式不对):

config.gem "authlogic"
config.gem "authlogic-oid", :lib => "authlogic_openid"
config.gem "ruby-openid", :lib => "openid"

为了使空白Rails应用程序正常工作,我运行了rake db:migrate,然后通过控制台添加了一个用户:openid_identifier字段设置为我控制的字段。到现在为止还挺好。但尝试创建新会话失败,出现此错误:

    Processing UserSessionsController#create (for 127.0.0.1 at 2009-12-31 11:35:59) [POST]
    Parameters: {"commit"=>"Login", "user_session"=>{"openid_identifier"=>"richdev.myopenid.com"}, "authenticity_token"=>"BcsIKNpumqZrTV/bdSLQ6szBvq6kpaAIxJRmYgxySLU="}
    OpenIdAuthentication::Association Load (0.3ms)   SELECT * FROM "open_id_authentication_associations" WHERE ("open_id_authentication_associations"."server_url" = 'http://www.myopenid.com/server') 
    Generated checkid_setup request to http://www.myopenid.com/server with assocication {HMAC-SHA1}{4b3cf228}{mWlzhg==}
    Redirected to http://www.myopenid.com/server?openid.assoc_handle=%7BHMAC-SHA1%7D%7B4b3cf228%7D%7BmWlzhg%3D%3D%7D&openid.ax.mode=fetch_request&openid.identity=http%3A%2F%2Frichdev.myopenid.com%2F&openid.mode=checkid_setup&openid.return_to=http%3A%2F%2Flocalhost%3A3001%2Fuser_sessions%2Fcreate%3Ffor_session%3D1%26_method%3Dpost%26open_id_complete%3D1%26openid1_claimed_id%3Dhttp%253A%252F%252Frichdev.myopenid.com%252F%26rp_nonce%3D2009-12-31T19%253A35%253A59ZUEd2eN&openid.trust_root=http%3A%2F%2Flocalhost%3A3001%2F
    Completed in 15ms (DB: 0) | 302 Found [http://localhost/user_sessions]


    Processing ApplicationController#index (for 127.0.0.1 at 2009-12-31 11:36:00) [POST]
    Parameters: {"openid.mode"=>"id_res", "openid.return_to"=>"http://localhost:3001/user_sessions/create?for_session=1&_method=post&open_id_complete=1&openid1_claimed_id=http%3A%2F%2Frichdev.myopenid.com%2F&rp_nonce=2009-12-31T19%3A35%3A59ZUEd2eN", "openid.sig"=>"l+tfFAmeKsskHKlOYRoZF7yHM7Q=", "rp_nonce"=>"2009-12-31T19:35:59ZUEd2eN", "openid.op_endpoint"=>"http://www.myopenid.com/server", "for_session"=>"1", "openid.response_nonce"=>"2009-12-31T19:36:00ZBhX5fE", "openid1_claimed_id"=>"http://richdev.myopenid.com/", "openid.identity"=>"http://richdev.myopenid.com/", "open_id_complete"=>"1", "openid.assoc_handle"=>"{HMAC-SHA1}{4b3cf228}{mWlzhg==}", "openid.signed"=>"assoc_handle,identity,mode,op_endpoint,response_nonce,return_to,signed"}

    ActionController::MethodNotAllowed (Only get, put, and delete requests are allowed.):


    Rendered rescues/_trace (96.3ms)
    Rendered rescues/_request_and_response (0.5ms)
    Rendering rescues/layout (method_not_allowed)

问题似乎发生在从openid提供程序重定向期间,此时调用ApplicationController #index而不是UserSessionsController #create。我不确定这是OpenID问题还是Warp Drive问题。

如何将Authlogic / OpenID应用程序捆绑为Warp Drive Gem并使身份验证成功运行?

更新:为user_session添加显式资源定义可以解决问题。在routes.rb中:

map.resources :user_sessions

不确定原因,并且似乎不需要任何其他控制器。

2 个答案:

答案 0 :(得分:0)

两件事情有效:

  1. 在routes.rb中添加显式的user_session资源定义:

    map.resources:user_sessions

  2. 使用warp驱动器gem删除应用的routes.rb中的默认路由。

答案 1 :(得分:0)

删除routes.rb中的默认路由

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

解决了一个可怕的路由问题,即warp驱动器中的资源路由:

map.resources :users, :member => {:activate => [:post, :get]}

创建了一个URL:/ users /:id / activate(。:format)

但是对该URL的HTTP请求导致:action和:id在传递给控制器​​时反转(就像解释为默认URL一样)。 e.g。

Parameters = {"action"=>"123456", "id"=>"activate", "controller"=>"users"}

不漂亮。删除warp驱动器或客户端应用程序中的默认路由。但是,在客户端应用程序中执行此操作似乎更安全。