Single sign on 没有浏览器的SAML和Java独立应用程序?

Single sign on 没有浏览器的SAML和Java独立应用程序?,single-sign-on,saml,wso2is,spring-saml,Single Sign On,Saml,Wso2is,Spring Saml,我正在用SP(Spring SAML)和IDP(WSO2IS)测试SSO。他们在浏览器上工作得很好 现在我想把它带到一个Java独立应用程序中。提供用户凭据和SP URL,然后用户可以登录应用程序并访问SP。 为了实现这一点,基本上我需要使用HTTPClient(用于处理Cookie、POST、重定向、自动POST)并遵循浏览器上发生的SAML消息流 我想知道最有效的方法。有图书馆或例子吗 非常感谢您的帮助。我使用HtmlUnit headless浏览器创建了一个相对简单的解决方案。在我的例子中

我正在用SP(Spring SAML)和IDP(WSO2IS)测试SSO。他们在浏览器上工作得很好

现在我想把它带到一个Java独立应用程序中。提供用户凭据和SP URL,然后用户可以登录应用程序并访问SP。 为了实现这一点,基本上我需要使用HTTPClient(用于处理Cookie、POST、重定向、自动POST)并遵循浏览器上发生的SAML消息流

我想知道最有效的方法。有图书馆或例子吗


非常感谢您的帮助。

我使用HtmlUnit headless浏览器创建了一个相对简单的解决方案。在我的例子中,我不得不从一个需要SAML认证的网站下载一个PDF文件

import com.gargoylesoftware.htmlunit.UnexpectedPage;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;

...

private static byte[] samlAuthenticateAndDownloadFile(String url, String username, String password) throws Exception {
    byte[] fileBytes;
    try (final WebClient webClient = new WebClient()) {
      final HtmlPage loginPage = webClient.getPage(url);

      final HtmlForm loginForm = loginPage.getForms().get(0);

      final HtmlSubmitInput button = loginForm.getInputByName("login");
      final HtmlTextInput usernameField = loginForm.getInputByName("username");
      final HtmlPasswordInput passwordField = loginForm.getInputByName("password");

      usernameField.setValueAttribute(username);
      passwordField.setValueAttribute(password);

      final UnexpectedPage pdfPage = button.click();

      InputStream inputStream = pdfPage.getInputStream();

      fileBytes = IOUtils.toByteArray(inputStream);
    }

    return fileBytes;
  }

这就像使用SAML的笨拙方式。为什么要这样做,应用程序的目的是什么?实际上独立应用程序不需要SSO功能。由于IDP具有用户数据存储,因此应用程序希望通过IDP验证用户,并允许他们使用SP,以便执行一些REST请求。有更好的方法吗?好的,最好的方法是如果IDP实现了其他一些协议来使用,因为这不是真正的最佳方法。但是我锁定了一些更好的解决方案,你可以尝试搜索一些无头浏览器来在你的代码中使用。这是一种反模式,只将身份验证锁定为用户名/密码,并且破坏了SAML的主要目的之一;它也是非常脆弱的,因为它可能与您当前的SAML提供商软件一起工作,但在升级或更改时可能会中断,这是实施/使用标准之外的问题