Oauth 2.0 我可以为与API(我自己的)紧密耦合的SPA使用授权码授权吗?

Oauth 2.0 我可以为与API(我自己的)紧密耦合的SPA使用授权码授权吗?,oauth-2.0,single-page-application,auth0,Oauth 2.0,Single Page Application,Auth0,我正在构建一个Angular(版本5)应用程序,它只与一个后端(我的API(web服务器上的flask应用程序))通信,而我的API又与我的数据库通信。该应用程序用于数据输入和可视化,数据不断加载并保存到后端或从后端保存。我可以控制这三个部分 我正在考虑使用Auth0来处理auth/用户管理 我的问题是,我是否可以将此应用程序视为“常规”web应用程序,并使用身份验证代码授权,而不是SPA通常建议的隐式授权?即: SPA将通过/login端点从auth0获取一个授权代码,并重定向到相应的auth

我正在构建一个Angular(版本5)应用程序,它只与一个后端(我的API(web服务器上的flask应用程序))通信,而我的API又与我的数据库通信。该应用程序用于数据输入和可视化,数据不断加载并保存到后端或从后端保存。我可以控制这三个部分

我正在考虑使用Auth0来处理auth/用户管理

我的问题是,我是否可以将此应用程序视为“常规”web应用程序,并使用身份验证代码授权,而不是SPA通常建议的隐式授权?即:

  • SPA将通过/login端点从auth0获取一个授权代码,并重定向到相应的auth0页面
  • 授权代码通过某个端点(可能是/回调端点)传递给API
  • API与Auth0对话,以将AC交换为令牌
  • 令牌随每个请求一起传递到数据库,如果令牌无效,则拒绝(使用postgresql可以在数据库中进行令牌有效性检查)
  • API服务器上的令牌与用户之间的关联是通过加密的cookie(Flask的'session'变量)完成的
  • 通过阅读关于隐式授权与身份验证代码授权的大量讨论,似乎主要区别在于,在真正的SPA应用程序中,没有由资源提供者控制的单个服务器可以存储客户端机密或令牌。但是,就我的情况而言,难道我不能将SPA应用程序看作是一个传统的(ajax密集型)web页面吗


    我在auth0论坛中发现了这一点,它暗示这可能是“脆弱的,因为在实践中,OAuth2流是由两个独立的组件处理的”,但我不理解组件之间的独立性会有什么区别。

    是的,您可以使用身份验证代码授权。如果您使用它,则有一些设计含义:

    • 您的后端将扮演OAuth2客户端的角色,而不是SPA
    • 如果您将令牌从后端传递到SPA并将其用于身份验证(如果这是您在问题中的第4点的意思),令牌将在一段时间后过期,用户将不得不再次进行身份验证过程,这可能会很烦人
    因此,我建议:

    • 要执行身份验证,后端应该有两个端点—一个用于重定向到OAuth2服务器,另一个用于接受来自OAuth2服务器的重定向(包含身份验证代码)。没有必要将代码发送到您的SPA
    • 后端将代码交换为令牌。如果需要,令牌可以保存在后端会话中,或者只在会话中保存用户信息——您可能不再需要令牌了

    因此,使用这两种授权的主要区别在于,使用隐式授权时,您的SPA需要能够在到期前续订令牌(请参阅),并且在使用身份验证代码授权时,后端需要是有状态的—以便为其客户端保留会话。

    是的,您可以使用身份验证代码授权。如果您使用它,则有一些设计含义:

    • 您的后端将扮演OAuth2客户端的角色,而不是SPA
    • 如果您将令牌从后端传递到SPA并将其用于身份验证(如果这是您在问题中的第4点的意思),令牌将在一段时间后过期,用户将不得不再次进行身份验证过程,这可能会很烦人
    因此,我建议:

    • 要执行身份验证,后端应该有两个端点—一个用于重定向到OAuth2服务器,另一个用于接受来自OAuth2服务器的重定向(包含身份验证代码)。没有必要将代码发送到您的SPA
    • 后端将代码交换为令牌。如果需要,令牌可以保存在后端会话中,或者只在会话中保存用户信息——您可能不再需要令牌了

    因此,使用这两种授权的主要区别在于,使用隐式授权时,您的SPA需要能够在到期前更新令牌(请参阅),并使用身份验证码授权,后端需要有状态-为其客户端保留会话。

    我认为授权代码应该发送回SPA,SPA然后调用/oauth2/token将其交换为令牌?我认为授权代码应该发送回SPA,SPA然后调用/oauth2/token将其交换为令牌?我同意将初始oauth2 enpoint保持在API端,但这会导致302重定向响应,这会导致CORS错误,因为API和SPA在不同的域上运行。对于XmlHttpRequest,302也不能被截获,因为浏览器在JS对其进行操作之前处理它。那么,只需返回带有自定义响应的ouath url,然后再次从客户端打开该url,这样好吗?要从后端重定向到OAuth2服务器,必须执行整个浏览器请求,而不是XmlHttpRequest。所以CORS没有问题。您也可以通过从后端获取URL并从JavaScript执行重定向来实现这一点,但是您需要将后端的详细信息带到前端?因为SPA意味着使用ajax调用。您可以使用简单的HTML锚元素
    ,或者使用
    window.location.href
    window.open
    from JavaScript.Yes。我只是那样做的。但我想检查流是否可以从API本身启动。对于MVC应用程序来说似乎是可能的,但不可能使用API进行SPA。我同意将初始oauth2 enpoint保留在API端,但这会导致302重定向响应,这会导致CORS错误,因为API和SPA在不同的域上运行。而且,对于XmlHttpRequest,302也不能被拦截,因为浏览器在JS启动之前处理它