【问题标题】:CORS and the OAuth 2 authorization code flowCORS 和 OAuth 2 授权代码流
【发布时间】:2015-12-16 18:51:44
【问题描述】:

我有一个受 OAuth 2 授权代码流保护的后端应用程序。前端(浏览器中的javascript)命中后端的授权端点,后端将浏览器重定向到授权代码服务器,用户进行身份验证,然后授权服务器使用授权代码将浏览器重定向回后端后端兑换令牌以访问某些服务。

问题是这些重定向都是连续发生的,浏览器中的 CORS 阻止了交换。就 CORS 而言,服务器需要做什么才能使此流程正常工作?

browser                                 -> POST app.com/auth
307 auth.com/auth?redirect=app.com/auth <-
browser                                 -> POST auth.com/auth?redirect=app.com/auth (with authorization header)
307 app.com/auth?authcode=fubar         <-
browser                                 -> POST app.com/auth?authcode=fubar

大致是这样的。

编辑: 浏览器说

XMLHttpRequest 无法加载 http://app.com/autho。这 请求被重定向到 'http://autho.com/auth?response_type=code&redirect_uri=http://app.com/autho&state=639bfbe7-fd20-4c04-8feb-c9f60f4d55a9&client_id=0xdeadbeef', 对于需要预检的跨域请求,这是不允许的。

EDIT2:所以重定向可以在没有Authorization 标头的情况下正常工作。猜猜数据现在正在进入正文中。

【问题讨论】:

  • 您能分享一下 CORS 错误吗?
  • 您应该确保您的后端允许预检 OPTIONS 请求,这些请求在您的 POST 请求之前发送。
  • @mcranston18 这些已启用,我只是不确定他们应该返回什么。除了允许的主机之外,是否应该显式返回所有方法和标头?是否需要返回其他内容才能启用重定向?

标签: javascript authentication redirect oauth-2.0 cors


【解决方案1】:

在我看来不正确的是,您正在尝试使用来自 JavaScript 的重定向协议流。

通常,您的浏览器会被重定向到授权服务器,并且在成功通过身份验证后,浏览器会被重定向回应用程序,并带有身份验证码或访问令牌(取决于使用的流程)。

在这种情况下,您不是通过 JavaScript 与授权服务器对话,因此跨源考虑不会发挥作用。

如果您想从 JavaScript 客户端使用 OAuth2,我建议您查看 implicit grant,这是为 JavaScript 应用程序等不受信任的客户端设计的重定向流程。

【讨论】:

  • 有趣,所以如果重定向和参数传递都是从 HTML CORS 完成的,就不会发挥作用吗?我不使用隐式授权,因为它不是需要令牌(已在其他地方处理)的 javascript 应用程序,而是需要令牌来访问其他应用程序/服务的后端应用程序。
  • 对于隐式授权,这些重定向也不会跟随 javascript 对吗?
  • 对,同源策略适用于从域 A 加载的脚本,对域 B 进行 API 调用。如果您的后端应用程序是受信任的客户端,您可以使用授权代码授权,但您的浏览器仍然可以导航到授权服务器进行身份验证。隐式授权也是如此。
  • 不再推荐隐式授权。 docs.microsoft.com/en-us/azure/active-directory/develop/…。我认为问题是授权页面是否必须在服务器端呈现。
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 2016-10-15
  • 1970-01-01
  • 2020-10-15
  • 2018-08-05
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多