【发布时间】: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