单页应用:授权代码授予OAuth2

时间:2016-10-24 17:14:55

标签: angular oauth-2.0 authorization single-sign-on spring-security-oauth2

我正在关注教程Spring Boot and OAuth2。 当前端和后端位于不同的服务器上时,我需要对基于服务器的OAuth2流程有所了解。

根据教程后端提供的/ login / facebook端点基本上重定向到facebook并在授权后返回重定向URL。当前端是后端部署的一部分时,它工作正常。然而,当我将前端和后端分成不同的应用程序时,我遇到了问题,需要深入了解正确的事情。

  • 假设FE是localhost:3000和my-super-duper-site.com
  • 我们假设BE是localhost:8080,对公众不可见
  • 假设FE使用angular2和BE使用spring boot

我现在如何看待/完成它:

  1. 用户打开fronend并导航到那里的登录页面
  2. 有一个通过Facebook授权的链接。它看起来如此 实际应该指向后端/登录/ facebook网址,但后端 公众不会看到,所以我在FE中添加了一个代理 将FE登录URL转换为引擎盖下的BE登录URL。就是它 正确的吗?
  3. 一旦后端登录端点命中 - 它会将用户重定向到用户授权我的应用的授权服务器,并应将用户重定向到带有令牌的重定向网址,对吗?
  4. 在我的情况下,重定向网址应该是FE页面,因为后端对公众不可见。因此,看起来我在FE侧获得了令牌,并且应该将令牌放入每个FE-> BE请求中。这是它应该如何运作的方式吗?
  5. 重定向到FE还会导致单页应用重新加载,我不认为有办法避免这种情况..
  6. 最后一个问题是:如果用户未经过身份验证并导航到网址,例如/ myapp / order?id = 1我希望向用户显示登录对话框,一旦获得授权,我希望用户被重定向回/ myapp / order?id = 1。有可能吗?
  7. 我知道有客户端流程,但我不想在客户端保密(hello逆向工程)以及创建服务器流的内容。

1 个答案:

答案 0 :(得分:0)

根据您的描述,您似乎已经实施了 OAuth 来验证来自 Facebook 的用户。您必须在 facebook 上创建了一个 OAuth 客户端。

OAuth2.0 授权代码授予流程以这种方式工作

 +--------+                               +---------------+
 |        |--(A)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(B)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)-- Authorization Grant -->| Authorization |
 |Your BE |                               |     Server    |
 |        |<-(D)----- Access Token -------|   Facebook    |
 | Client |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(F)--- Protected Resource ---|               |
 +--------+                               +---------------+

在客户端 -> 服务器模型的情况下很棘手,特别是在 SPA 中。

你如何处理。

  1. 创建您的 OAuth2.0 客户端,将重定向 uri 配置为您的 后端。
  2. 拦截重定向uri。获得令牌的那一刻,您可以通过 SSE Emitter 将令牌传递给前端服务器,或者您也可以轮询检查令牌可用性的特定端点。找到后发送回复。