【问题标题】:OAuth 2 authentication for both iframe and apiiframe 和 api 的 OAuth 2 身份验证
【发布时间】:2018-01-11 09:32:12
【问题描述】:

我正在将多个网站/服务集成到我的应用程序中。我使用 iframe(或 Vue Electron 的 webview)进行 UI 集成,我还使用 API 来实现这些服务之间的交叉通信。

目前,我必须为每个服务通过 OAuth 2 身份验证两次:一次是 iframe 中自然身份验证的一部分,另一次是我要求用户授予我访问此服务的权限(出于 api 原因)。

有没有办法简化这个过程?

【问题讨论】:

    标签: authentication oauth oauth-2.0 google-oauth


    【解决方案1】:

    最先进的响应是完全修改您的应用程序。

    • 您应该有 1 个 SPA 应用程序而不是 iframe
    • 此应用程序将进行身份验证以获取 OAuth2 令牌
    • 然后此应用程序会调用后端(访问多个后端,或访问调用后端的 API 管理层)。

    问题是,有了这个你可以有两种策略:

    • 在第一次身份验证时授予所有权限(范围)
    • 在第一次身份验证时提供可能的缩小范围,然后在需要时“重新验证”(实际上是验证新范围)以获取新的访问令牌

    当一个 API 想要调用另一个 API 时,你还有 3 个策略:

    • 您只需将 API 接收到的相同客户端令牌用于您的 API 调用服务(无需人工交互)
    • 您的 API 从服务帐户(使用 ROPC 身份验证方案)或通过客户端凭据方案(访问令牌将有效但通常不会绑定到真实用户)生成令牌,(无需人工交互)。 (API 将是第二个 API 的客户端)
    • 您的身份提供者有一个端点来转换访问令牌:您的 API 可以提供客户端访问令牌,授权服务器将使用您 API 的 client_id 转换它。您将此令牌发送到 2ndAPI(令牌将显示您的 UI 应用程序的主题,但客户端 ID 将是第一个 API 客户端 ID)(无需人工交互)

    现在,如果您将 IFrame 与同一域上的多个子应用程序一起使用(域需要完全相同!),则可以通过本地存储共享相同的访问令牌。 (安全性不是一流的) 有时您可能需要使用更大的范围列表进行身份验证,但这是您唯一的选择。您将模拟一个单页应用程序,但问题是您可能会有不同的 client_id,具体取决于您验证到的第一个应用程序。

    编辑:多授权服务器

    根据您的评论,您有多个授权服务器。一种策略可能是要求用户进行身份验证,然后您的应用程序可以获得 access_token 和 refresh_token。 根据您的授权服务器,refresh_token 可以在很长一段时间内大量/使用,因此如果您将其存储在某个地方,下次用户访问您的应用程序时,您的应用程序可以静默地从该刷新令牌中获取 access_token。然后,您的应用程序无需与您的用户进行更新的交互即可访问删除 api。 当然,这意味着您必须尽可能安全地保存此令牌。

    【讨论】:

    • 感谢您提供如此详细的回答!不幸的是,我无法摆脱 iframe(或 Vue Electron 本机应用程序的 Web 视图),因为该应用程序的整个想法是将不同的第三方服务(如 slack)与其本机 uis 结合起来。显然,使用他们的 api 实现我自己的 slack ui 超出了我的能力范围。
    • 在多授权服务器的东西上添加了几个词。
    • 关于更新。您对刷新令牌完全正确,这就是我为后端部分所做的。基本上,问题是是否可以将此令牌提供给 slack iframe。我想这是不可能的......
    • 不,您不能将此令牌交给其他人。有人可以编写一个 api 来收集这个,但它是一个安全漏洞,所以它不应该存在。
    【解决方案2】:

    通过使用 OpenID Connect,您可以在一个步骤中结合身份验证和授权,并在一个身份验证响应中同时获得 id_token 以让您的用户登录到您的应用程序以及访问 API 的 access_token

    【讨论】:

    • 这听起来很有希望。您是否同时有关于 api&iframe 身份验证的任何指南/参考?
    • 这取决于用例:您是从 iframe 中运行的 Javascript 调用 API,还是指您的服务器后端调用其他服务 API?
    • 第二个选项。示例:我集成了 Slack 的 iframe,并在我的后端使用他们的 api 做一些后台操作
    • 您希望您的用户针对 Slack 进行身份验证,还是您自己或其他地方进行身份验证?
    • 目前用户必须进行两次身份验证:一次用于 api,一次用于 Slack iframe。我正在考虑使这个过程更顺畅。只保留一个身份验证将是完美的,但要到达那里,我需要将 api 的令牌提供给 Slack iframe,或者从 Slack 的 iframe 中提取令牌并将其提供给 api 后端。这两种选择似乎都不太可能......
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 2017-10-13
    • 1970-01-01
    • 2019-12-27
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多