Oauth 2.0 我可以为与API(我自己的)紧密耦合的SPA使用授权码授权吗?
我正在构建一个Angular(版本5)应用程序,它只与一个后端(我的API(web服务器上的flask应用程序))通信,而我的API又与我的数据库通信。该应用程序用于数据输入和可视化,数据不断加载并保存到后端或从后端保存。我可以控制这三个部分 我正在考虑使用Auth0来处理auth/用户管理 我的问题是,我是否可以将此应用程序视为“常规”web应用程序,并使用身份验证代码授权,而不是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
我在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启动之前处理它