Rails:通过不同域进行身份验证

Bar*_*red 1 authentication ruby-on-rails multiple-domains devise

我必须将我正在开发的 Web 应用程序与外部 Web 应用程序集成才能使用它们的服务。不幸的是,这是我的第一部作品,我有点困惑。

他们要求我提供带有登录令牌的验证 URL,以帮助他们识别哪些用户来自我的网站。

  1. 我的应用程序中的用户想要从 3party 应用程序数据库中获取信息
  2. 为此,3party 应用程序需要知道他们是谁,因为应用程序中有不同的角色。他们每个人都将在 3party 应用程序上拥有不同的权限
  3. 登录 3party 应用程序必须在我的应用程序中。他们只想要一个带有登录令牌的验证 URL。

是否可以通过设计使用令牌身份验证来做到这一点?我可以生成令牌,将其存储在客户端浏览器中,然后使用它在外部域中对它们进行身份验证吗?

jef*_*unt 5

我希望这个答案不会太明显。听起来您才刚刚开始,需要一些指导。

根据我的阅读,我得到以下要求:

  1. 您需要能够成为另一个应用程序的身份验证机构
  2. 第 3 方应用程序希望通过身份验证令牌交换和验证凭据
  3. 第 3 方应用程序希望 API 调用的 URL 从您的应用程序执行此操作

我会从广义上讲这个,让你寻找一个具体的解决方案。基本上,您需要一种生成安全身份验证令牌的方法。Devise 应该与authlogic其他几个一起这样做。您不想做的是尝试推出自己的身份验证令牌生成。绝对使用那里的宝石为您做这件事。

生成令牌后,这里是基本事务的概述,其中身份验证令牌只是作为参数传递给控制器​​操作(https 是您在此事务中的朋友,仅供参考)。

在此处输入图片说明

  1. 第 3 方应用程序使用您的应用程序提供的令牌进行 API 调用
  2. 您的应用程序检查身份验证令牌的有效性,如果身份验证成功,则执行请求的任何操作
  3. 如果身份验证成功,您的应用程序将使用身份验证成功/失败代码以及第 3 方应用程序请求的任何其他响应数据进行响应

如何将令牌传递给第 3 方应用程序,以便它可以使用它来发出 API 请求,这取决于您希望应用程序如何工作。但是,一种常见的做法是使用遵循以下模式的方法:

  1. 当第 3 方应用程序需要代表用户发出 API 请求时,第 3 方应用程序会重定向到您的应用程序,用户在其中输入其凭据(如果尚未输入)。这样,第 3 方应用程序永远不会直接获取用户的用户名+密码。
  2. 假设身份验证成功,您的应用程序然后重定向回您的回调 URL,将您的应用程序生成的身份验证令牌作为参数传入。该身份验证令牌将在未来的 API 调用中使用,直到并且除非身份验证令牌过期(当然,它们何时过期取决于您,因为您是身份验证机构)。

如果可能的话,如果您实际上可以使用 OAuth 提供程序或其他一些已经存在的机制来充当第 3 方身份验证意味着您的应用程序和第 3 方应用程序都信任,那就太好了。要沿着这条路线走下去,请查看此 Railscast:http: //railscasts.com/episodes/235-omniauth-part-1

...但当然,由于您已经有一个现有的应用程序,尤其是在企业应用程序中,能够将 oauth 提供程序集成到您的应用程序中的情况并不常见。但无论哪种方式,只要有可能,将身份验证机制卸载给另一方几乎总是可取的。这主要是因为您希望安全专家担心并更新他们的身份验证服务,并将应用程序代码留给您。

另一方面,即使您不使用 OAuth 提供程序来解决这个问题,上面提到的 railscast 也会为您提供构建自己的 API/回调机制时遵循的想法和模式。您最终会得到一系列 API 调用/操作。当然,路由(这些 API 调用的 URL)可以是任何东西。但作为一个例子,它们可能看起来像这样:

/api/auth/:id                     {:controller=>"api", :action=>"auth"}
Run Code Online (Sandbox Code Playgroud)

...作为参数,标识第 3 方应用程序的唯一密钥,以及第 3 方应用程序的密钥(基本上是密码),以及成功和失败的回调 url,并以成功/失败进行响应,以及成功后的有效身份验证令牌。

/api/some/restful/resource/call   # example API call for some RESTful resource you make available
... etc. ...
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,即使您不使用 3rd 方身份验证提供程序,遵循我发布的 railscast(以及后续剧集)也会让您了解其他强大的 API 使用的实现模式。设置一个演示应用程序来进行 facebook 身份验证也非常有指导意义,可能只需要几个小时,就可以掌握工作流程。