ruby-on-rails 使用Rails 7、Devise和Doorkeeper的授权服务器

pokxtpni  于 2023-05-19  发布在  Ruby
关注(0)|答案(1)|浏览(136)

我正在使用Devise和Doorkeeper构建Rails 7服务器。
我们将支持两组用户,一组是omniauths到amouath提供程序的用户,另一组是对数据库进行身份验证的用户。

我能够对提供者进行oauth,并且我可以添加doorkeeper并使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成功回调期间在哪里可以找到应用程序,这样我就可以重定向到正确的位置

vfhzx4xs

vfhzx4xs1#

没有任何支持,你必须构建它,但这并不困难。
当您的客户端在OAuth/OIDC流中到达您的服务器时,并且您希望进一步委托一些下游OAuth提供者来实际执行授权,则由您来存储原始授权请求参数,并在用户从下游OP返回时恢复它们。只需存储整个URL(包括查询字符串),就可以轻松地做到这一点。
您通常会在会话中执行此操作,可能会将请求与某种ID相关联,以便可以确保用户作为同一授权流的一部分返回(而不是用户放弃该流,然后通过其他路径返回)。您可以将该ID发送到state参数中的OP,该参数将不加修改地发送回给您。
这可能就像这样简单:

rid = SecureRandom.uuid # request ID
session[:auth_req] = {
   # Something like /auth?client_id=xxx&response_type=code&redirect_uri=yyy&etc
  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

相关问题