单页应用程序:使用 OAuth2 授予授权码

Vad*_*huk 5 authorization single-sign-on oauth-2.0 spring-security-oauth2 angular

我正在关注教程Spring Boot 和 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 授权。看起来它实际上应该指向后端 /login/facebook url,但后端不会对公众可见,所以我向 FE 添加了一个代理,它将 FE 登录 url 转换为引擎盖下的 BE 登录 url。那是对的吗?
  3. 一旦后端登录端点命中 - 它会将用户重定向到用户授权我的应用程序的授权服务器,并且应该将用户重定向到带有令牌的重定向 URL,对吗?
  4. 在我的情况下,重定向 url 应该是一个 FE 页面,只是因为后端对公众不可见。因此,看起来我在 FE 端获得了令牌,并且应该将令牌放入每个 FE->BE 请求中。这是它应该如何工作的方式吗?
  5. 重定向到 FE 还会导致单页应用程序重新加载自身,我认为没有办法避免这种情况。
  6. 最后一个问题是:如果用户未通过身份验证并导航到 url,例如 /myapp/order?id=1 我希望向用户显示登录对话框,一旦获得授权,我希望用户被重定向回到 /myapp/order?id=1。是否可以?

我知道有客户端流程,但我不想对客户端保密(你好逆向工程),这就是创建服务器流程的目的。

Ami*_*hra 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 ---|               |
 +--------+                               +---------------+
Run Code Online (Sandbox Code Playgroud)

对于客户端 -> 服务器模型,特别是在 SPA 中,这是很棘手的。

你如何处理这个问题。

  1. 创建 OAuth2.0 客户端,配置重定向 uri 到您的后端。
  2. 拦截重定向uri。获得令牌后,您可以通过 SSE Emitter 将令牌传递到前端服务器,也可以轮询特定端点以检查令牌可用性。当您找到它时,您会发送响应。