Rails 3 + Omniauth:将额外参数传递给api服务器(DoorKeeper)
我正在为我的应用程序创建一个API。一方面是API服务器(和主应用程序),另一方面是客户端。服务器使用DoorKeeper使用OAuth 2.0保护API(基本上将主应用程序转换为OAuth 2.0提供程序),客户端使用OmniAuth和我的应用程序的自定义策略。Rails 3 + Omniauth:将额外参数传递给api服务器(DoorKeeper)
主应用程序使用多租户使用子域;所以每个客户都有自己的子域名。还有一个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路线,但这个参数是不能传递到服务器应用程序(看门人) ,所以我不知道在服务器应用上重定向到哪里。
看门配置resource_owner_authenticator do p params
User.find_by_id(session[:user_id]) || redirect_to(log_in_path)
end
在上面的重定向,我需要指定客户的账户名作为子域,但由于params哈希表简化版,包含我没有这个信息(客户的帐户名)客户端的我通过的帐户名称(客户端参数)
回答:
我发现了如何解决我的问题。我不得不深入研究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
时,添加要传递任何额外参数,它只是工作!
回答:
最简单的方法是在重定向到登录页面时将位置重定向到验证后成功地作为查询参数传递,因此它在那里作为GET请求的查询字符串的一部分。存储它,并在成功的身份验证后,将它们重定向到那里。根本不需要将这些数据包含在OAuth流程中。
当然,我假设他们都在也在他们的子域开始。
编辑:
当用户点击“我的应用登录”链接时,他被redireced到OAuth的子域。
假设用户开始在
mysubdomain.yourapp.com
,他们点击“登录与我的应用程序”链接。的链接还包含在它的子域的查询参数,所以
oauth.yourapp.com?redirect=mysubdomain.yourapp.com
(或只是oauth.yourapp.com?redirect=mysubdomain
)用户到达oauth.yourapp.com。该应用程序存储查询参数。用户放入其详细信息或重定向到服务...
OAuth进程完成后,用户已通过身份验证。
将用户重定向回到之前存储的参数
redirect
。
这是我要做的事,只是没有使用Rails,但我不明白为什么你不能与任何框架使用此过程。正如我所提到的,这取决于用户在正确的子域名上开始。
以上是 Rails 3 + Omniauth:将额外参数传递给api服务器(DoorKeeper) 的全部内容, 来源链接: utcz.com/qa/263603.html