【问题标题】:Rails 3 + Omniauth: pass extra params to the api server (DoorKeeper)Rails 3 + Omniauth:将额外的参数传递给 api 服务器(DoorKeeper)
【发布时间】:2013-02-12 03:43:56
【问题描述】:

我正在为我的应用程序创建一个 API。一方面是 API 服务器(和主应用程序),另一方面是客户端。服务器使用 DoorKeeper 来保护使用 OAuth 2.0 的 API(基本上将主应用程序转变为 OAuth 2.0 提供程序),并且客户端使用 OmniAuth 和我的应用程序的自定义策略。

主应用使用子域使用多租户;所以每个客户端都有自己的子域。还有一个oauth 子域被路由到DoorKeeper 接口。

当用户点击“使用我的应用登录”链接时,他会被重定向到 oauth 子域。如果他没有登录到主应用程序,他需要被重定向到登录页面在正确的子域下。所以我需要将客户端的账户名传递给服务器,以便 DoorKeeper 知道要重定向到哪个子域。

请问我怎样才能做到这一点?

我对该主题进行了研究,并发现了如何传递给将传递给回调操作的 OmniAuth 参数。服务器可以使用这些参数吗?

编辑:我没有使用 Devise!

编辑 2:这是一些代码。

客户端应用会话控制器创建操作(使用我的应用登录)
def set_client
  self.current_client = Client.find(params[:client][:name])
  redirect_to "/auth/catapult?client=#{self.current_client.account_name}"
end

如您所见,我将客户端参数附加到 OmniAuth 路由,但此参数未传递给服务器应用程序(DoorKeeper),所以我不知道在服务器应用程序上重定向到哪里。

门卫配置
resource_owner_authenticator do
  p params
  User.find_by_id(session[:user_id]) || redirect_to(log_in_path)
end

在上面的重定向中,我需要将客户的帐户名称指定为子域,但我没有此信息(客户的帐户名称),因为 params 哈希不包含我传递的客户帐户名称(客户参数)

【问题讨论】:

    标签: ruby-on-rails api oauth


    【解决方案1】:

    我找到了解决问题的方法。我不得不深入挖掘 OmniAuth 源代码。我必须做的是在我的自定义策略中覆盖request_phase 方法,如下所示:

    def request_phase
      redirect client.auth_code.authorize_url({:redirect_uri => callback_url, :catapult_client => request.params["client"]}.merge(authorize_params))
    end
    

    :catapult_client 在哪里,添加任何你想传递的额外参数,它就可以工作了!

    【讨论】:

    • 我们如何为 token_url 处理同样的事情?我必须根据策略名称提供不同的 token_url。 authorize_url 可以根据 request_phase 方法中的策略提供不同的值。授权完成后,必须为 token_url 提供相同的策略名称才能获取令牌。知道如何实现这一目标吗?
    【解决方案2】:

    最简单的方法是在重定向到登录页面时将 place-to-redirect-to-after-authenticating-successfully 作为查询参数传递,因此它作为 GET 请求查询字符串的一部分存在。存储它,并在成功的身份验证后将它们重定向到那里。您根本不需要在 OAuth 过程中涉及这些数据。

    当然,我假设他们都开始在他们的子域。


    编辑:

    当用户点击“使用我的应用登录”链接时,他会被重定向到 oauth 子域。

    • 假设用户从mysubdomain.yourapp.com开始,他们点击“使用我的应用登录”链接。

    • 该链接还包含一个带有子域的查询参数,因此oauth.yourapp.com?redirect=mysubdomain.yourapp.com(或只是oauth.yourapp.com?redirect=mysubdomain

    • 用户到达 oauth.yourapp.com。应用程序存储查询参数。用户输入他们的详细信息或被重定向到服务……

    • OAuth 过程结束,用户已通过身份验证。

    • 将用户重定向回之前存储的redirect参数。

    我就是这样做的,只是不是在 Rails 中,但我不明白为什么你不能在 any 框架中使用这个过程。正如我所提到的,这取决于用户从正确的子域开始。

    【讨论】:

    • 对不起,我不明白你的答案...我添加了一些代码以使问题更清楚。
    • @AzizLight 我添加了更多解释。它会回答您的问题或提示您提供更多信息:)
    • 基本上用户在没有子域下启动,客户端应用程序是一个不同的应用程序(通常它可以是一个移动应用程序,只是碰巧它是另一个 Rails 应用程序),我需要做的是omn​​iauth 将额外的参数传递给门卫。所以基本上我不能使用你的方法,因为我自己没有做 GET 请求,OmniAuth 是......
    • @AzizLight 好的,我会留下这个,以防其他人觉得它有用,稍后我会看看 Doorkeeper,看看我能不能帮你解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多