1

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

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

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

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

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

编辑:我没有使用设计!

编辑 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 哈希不包含我传递的客户帐户名称(客户端参数)

4

2 回答 2

3

我发现了如何解决我的问题。我不得不深入挖掘 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,添加您想要传递的任何额外参数,它就可以工作!

于 2013-03-01T11:41:24.843 回答
1

最简单的方法是在重定向到登录页面时将 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。应用程序存储查询参数。用户输入他们的详细信息或被重定向到服务……</p>

  • OAuth 过程完成,用户已通过身份验证。

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

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

于 2013-03-01T09:57:06.893 回答