Authentication iframe和api的OAuth 2身份验证

Authentication iframe和api的OAuth 2身份验证,authentication,oauth,oauth-2.0,google-oauth,Authentication,Oauth,Oauth 2.0,Google Oauth,我正在将几个网站/服务集成到我的应用程序中。我使用iframes(或Vue Electron的webview)进行UI集成,还使用API实现这些服务之间的交叉通信 目前,我必须对每个服务进行两次OAuth 2身份验证:一次是作为iframe中自然身份验证的一部分,另一次是在我请求用户允许我访问该服务时(出于api原因) 有什么方法可以简化这个过程吗?最先进的方法是完全修改您的应用程序 您应该有一个SPA应用程序,而不是iframe 此应用程序将进行身份验证以获取OAuth2令牌 然后,该应用程

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

目前,我必须对每个服务进行两次OAuth 2身份验证:一次是作为iframe中自然身份验证的一部分,另一次是在我请求用户允许我访问该服务时(出于api原因)


有什么方法可以简化这个过程吗?

最先进的方法是完全修改您的应用程序

  • 您应该有一个SPA应用程序,而不是iframe
  • 此应用程序将进行身份验证以获取OAuth2令牌
  • 然后,该应用程序将调用后端(访问多个后端,或访问调用后端的api管理层)
问题是,有了它,你可以有两种策略:

  • 在第一次身份验证时授予所有权限(范围)
  • 在第一次身份验证时提供可能的小范围,然后在需要时“重新身份验证”(实际上是验证新范围)以获取新的访问令牌
当一个API想要调用另一个API时,您还有3种策略:

  • 您只需使用API接收到的同一客户端令牌来调用您的API服务(无需人工交互)
  • 您的API从服务帐户(使用ROPC身份验证方案)或通过客户端凭据方案(访问令牌将有效,但通常不会绑定到真实用户)生成令牌(无需人工交互)。(API将是第二个API的客户)
  • 您的身份提供者有一个端点来转换访问令牌:您的API可以提供客户端访问令牌,授权服务器将使用API的客户端id来转换此令牌。您将此令牌发送到2ndAPI(令牌将显示UI应用程序的主题,但客户端ID将是第一个API客户端ID)(无需人工交互)
现在,如果将IFrame与同一域上的多个子应用程序一起使用(该域需要完全相同!),则可以通过本地存储共享相同的访问令牌。(安全不是一流的) 有时您可能需要使用更大的范围列表进行身份验证,但这是您唯一的选择。您将模拟一个单页应用程序,但问题是,根据要验证的第一个应用程序,您可能会有不同的客户端id

编辑:多授权服务器

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

通过使用OpenID Connect,您可以在一个步骤中将身份验证和授权结合起来,并获得一个
id\u令牌来登录您的应用程序,以及一个
access\u令牌来在一个身份验证响应中访问API。

感谢您提供了这样的服务详细回答!不幸的是,我无法摆脱iFrame(或Vue Electron原生应用程序的web视图),因为该应用程序的整体思想是将不同的第三方服务(如slack)与其原生UI结合起来。显然,使用他们的api实现我自己的slack ui超出了我的能力范围。在多授权服务器上添加了一些内容。关于更新。关于刷新令牌,您完全正确,这就是我在后端部分所做的。基本上,问题是是否有可能将这个令牌提供给slackiframe。我想这是不可能的…不,你不能把这个代币给别人。有人可以编写一个api来收集这些信息,但这是一个安全漏洞,所以它不应该存在。这听起来很有希望。您是否同时有任何关于api和iframe身份验证的指南/参考?这取决于用例:您是从iframe中运行的Javascript调用api,还是指您的服务器后端调用其他服务api?第二个选项。示例:我集成了Slack的iframe,并在我的后端使用他们的api做了一些后台工作。您希望您的用户针对Slack进行身份验证,还是希望自己或其他地方对其进行身份验证?目前用户必须进行两次身份验证:一次针对api,一次在Slack iframe内部。我正在研究使这个过程更顺利。只保留一个身份验证是完美的,但要实现这一点,我要么需要将api的令牌提供给Slack iframe,要么从Slack的iframe提取令牌并将其提供给api后端。两种选择似乎都不太可能。。。