【问题标题】:How to implement SAML in a Flutter Web Frontend Application and a SpringBoot REST API?如何在 Flutter Web 前端应用程序和 SpringBoot REST API 中实现 SAML?
【发布时间】:2023-02-17 05:03:43
【问题描述】:

我正在尝试将 SAML 实施到我的应用程序中,它由一个 SPA (Flutter Web) 和一个 REST API (Springboot) 组成。但是我在实现 Flutter Frontend 应用程序、Springboot Rest API 和 SAML Identity Provider 之间的通信时遇到了问题。

目前我已经实现了一个初始 HTTP 请求(@GetMapping("/initial")),它在 Flutter 应用程序启动时调用,它检查是否配置了 SAML,然后将身份验证发布请求发送给身份提供者。 我的问题是身份提供者对 Rest API 的回答是 RestController 中的另一个 Post 映射 (@PostMapping("samlsso")。 然后我为通过身份验证的用户生成一个 Bearer Token 传递给 Flutter 应用程序以处理应用程序中的身份验证状态并自动登录用户。

但是如何将此令牌获取到 Flutter 应用程序呢?因为我使用的是 REST 控制器,所以我不应该在控制器中保存任何变量,但是为了让 Flutter 应用程序从 Rest API 接收数据,它必须发送对令牌本身的请求。但是 Flutter 应用程序不知道令牌何时准备好接收。我如何才能正确地实现这种通信,而无需任何手动延迟并将值保存在 RestController 类中的变量中?

PS:我已经尝试从 PostMapping 发送 response.redirect,它接收并处理 SAML 响应,直接发送到前端,但我只能通过标头发送它,无法从 Flutter 应用程序访问它.

后端代码:

@RestController
class SamlController {

    var samlToken = ""

    @GetMapping("/initial")
    fun findToken() {
        sendAuthRequestToIdp()
    }

    @PostMapping("/samlsso")
    fun findAll(request: HttpServletRequest, response: HttpServletResponse) {
        val user = receiveAndHandleIDPResponse()
        //handle errors

        val token = generateTokenFromIDPResponse()
    
        samlToken = token
    }

    @PostMapping("/getSamlToken")
    fun findAll(): ResponseEntity<String> {
        return ResponseEntity.ok(samlToken)
    }
}

前端代码:

Future<String> fetchSamlAuthentication () async {
  var jwtString = '';

  await launch("api_url/initial"); // launch, so that the IDP website opens in the browser
  await Future.delayed(const Duration(milliseconds: 10000));//wait manually until token has been generated
  final response = await _client.post(Uri.parse("api_url/getSamlToken"), headers: headers);
  jwtString = response.body;

  return jwtString;
}

这是我能够使用 SAML 对用户进行身份验证的唯一方法,但它不是一个干净/可用的解决方案。我需要一种更好的方法来将生成的令牌获取到 Flutter 应用程序并能够处理它。

【问题讨论】:

  • 你能让它同时工作吗?如果不是:您的 ACS 端点 (/samlsso) 需要向身份提供者返回成功响应。然后提供商会将浏览器发送到 /initial 的原始 HTTP 转发回您的 Flutter 前端。 ACS 端点还应该为前端设置身份验证 cookie。 cookie 是您登录前端的方式。

标签: flutter spring-boot saml


【解决方案1】:

SAML 2.0 基于浏览器;在 IdP 对用户进行身份验证后,IdP 发送 SAML 响应通过浏览器到应用程序的后端。这可能是您问题中对 POST /samlsso 的调用。

应用程序的后端随后应验证 SAML 响应,例如检查 SAML 响应中包含的任何签名是否有效,因为 IdP 的 SAML 元数据先前已在设置 SAML 连接时获得。

验证后,应用程序的后端应通过发送重定向响应来完成 POST /samlsso,该重定向响应包含指示用户已通过身份验证的令牌或 cookie。如何完成将取决于您的前端,特别是它是否基于浏览器。

在您的情况下,由于您的应用程序的前端在浏览器中运行并且您希望对后续请求使用承载令牌(相对于会话 cookie),因此您可以在重定向到的 URL 中包含令牌,这应该是在你的 Flutter 应用中路由。

当您的 Flutter 应用重新加载时,它可以从 URL 中检索令牌,并通过每个请求的授权标头将其传递给后续 API 调用。 希望您的不记名令牌在创建时已由您的后端签名,以便后端在处理后续请求时可以验证它是否合法获得。

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2016-11-19
    • 1970-01-01
    • 2020-11-08
    • 2012-04-13
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多