带有 Rails 7、Devise 和 Doorkeeper 的授权服务器

问题描述 投票:0回答:1

我正在使用 Devise 和 Doorkeeper 构建 Rails 7 服务器。

我们将支持两组用户,一组是 omniauths to ouath provider,另一组是对数据库进行身份验证。

我能够向提供商进行 oauth,我可以添加看门人并使 PKCE 流程基本正常工作但是当我处于 omniauth 回调中时,我似乎失去了启动 PKCE 流程的应用程序。

启动身份验证流程的代码正在使用(通过门卫)

resource_owner_authenticator do
  current_user || warden.authenticate!(scope: :user)
end

这有效,我得到了我成功的 omniauth 回调

def omniauth_successful_callback
  User.find_with_omniauth(<<request information>>)
  
  redirect_to <<redirect_page_path>>
end

这很好,如果我正在登录 Rails 应用程序,但是当我使用 PKCE 流程时,我需要重定向回启动应用程序,但是当我从 omniauth 返回时我似乎无法访问.

如何使用 PKCE 流程和 omniauth 以编程方式重定向到正确的应用程序?

我已经尝试寻找看门人令牌、阅读文档,并且为了测试我可以返回以完成流程,我已经为我正在测试的应用程序硬编码了重定向。我似乎无法在退货时找到应用程序。我目前正在探索尝试将应用程序名称发送给 oauth 提供商,让它回传给我,这样我就可以获得重定向,但这看起来很老套。

我希望有人能告诉我在 omniauth 成功回调期间我可以在哪里找到应用程序,这样我就可以重定向到正确的位置

ruby-on-rails ruby oauth-2.0 devise doorkeeper
1个回答
0
投票

没有对此的支持,你必须构建它,但这并不是那么困难。

当您的客户端在 OAuth/OIDC 流程中到达您的服务器,并且您希望进一步委托给下游的一些 OAuth 提供者以实际执行授权时,您需要存储原始授权请求参数,并在用户访问时恢复它们从下游 OP 返回。您通常会在会话中执行此操作,可能会将请求与某种 ID 相关联,以便您可以确保用户作为同一授权流程的一部分返回。您可以将该 ID 发送到 state 参数中的 OP,该参数将原封不动地发回给您。

这可能就像这样简单:

rid = SecureRandom.uuid # request ID
session[:auth_req] = {
  rid: request.full_path
}

# redirect to Omni-auth endpoint, passsing `rid` in `state` parameter

在你的回电中:

rid = params[:state]
auth_req_path = session[:auth_req][rid]
if auth_req_path
  # The user is now authenticated and we can "resume"
  # the original authorization request
  redirect_to auth_req_path
else
  # default action or error message
end
© www.soinside.com 2019 - 2024. All rights reserved.