OmniAuth动态回调URL用于验证特定对象而不是current_user

时间:2011-04-03 22:51:21

标签: omniauth ruby-on-rails-3

说我有模型用户和项目。用户和项目与HABTM相关。我的设置实际上比这更复杂,但我认为出于我的问题的目的,这将是。

现在,我想使用omniauth通过Twitter,Facebook验证特定项目,你有什么。我已经弄清楚如何定义我的omniauth path_prefix,但我不知道如何传递一个这样的变量:config.path_prefix = 'projects/:project_id/auth',更不用说像project /:project_id / auth / twitter一样自定义回调网址了/回调。

3 个答案:

答案 0 :(得分:1)

这将打破生产。在开发中,您可以使用会话变量。但是在生产中你需要让回调url包含你的project_id,因为它可能是2个或更多个不同的auth_project_id注册,然后你无法知道之后调用哪个(回调是异步的)。

https://github.com/mkdynamic/omniauth-facebook#custom-callback-urlpath

类似于config.path_prefix =" projects /#{@ project.id} / auth"可能有用。我现在正在测试类似的情况。

答案 1 :(得分:0)

为了后人的缘故,我这样解决了:

我在项目控制器中添加了auth方法,该方法设置会话变量session[:auth_project_id],然后重定向到auth/ + params[:provider]

在我的回调控制器authentications中,我使用@project = Project.find(session[:auth_project_id])创建了项目,创建了身份验证,然后session[:auth_project_id] = nil取消设置会话变量。

答案 2 :(得分:0)

我做了类似的设计omniauthable,你可以用链接传递任何参数。像

<%= link_to "Add twitter Account",  user_omniauth_authorize_path(:twitter, params:  { project_id: @project.id     }) %>

然后在你的回调控制器中

before_action :set_project, only: [:twitter]

def set_project
  @project = Project.find(request.env['omniauth.params']['project_id'])
end

注意:请勿使用request.env ['omniauth.auth']