【问题标题】:Single page app: authorization code grant with OAuth2单页应用程序:使用 OAuth2 授予授权码
【发布时间】:2017-03-06 13:21:01
【问题描述】:

我正在关注教程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. 用户打开前端并导航到那里的登录页面
  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。有可能吗?

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

【问题讨论】:

  • 同样的问题,希望有人解决。

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


【解决方案1】:

根据您的描述,您似乎已经实施了 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 将令牌传递给您的前端服务器,或者您也可以轮询特定的端点来检查令牌的可用性。当您找到它时,您会发送响应。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多