spring-security 如何调用由同一CAS SSO进行身份验证的外部REST API

vdgimpew  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(194)

我有一个由cas sso保护的微服务。还有另一个微服务也是由同一个cas服务器验证的。在我的应用程序中,我需要从第二个微服务调用一个rest api。我搜索了很多,只找到了一些关于它的信息,例如this。我同意尝试一下,如下所示:

final String targetUrl = "https://server/webappB";
final CasAuthenticationToken token = (CasAuthenticationToken) request.getUserPrincipal();
final String proxyTicket = token.getAssertion().getPrincipal().getProxyTicketFor(targetUrl);
final String serviceUrl = targetUrl+"?ticket="+URLEncoder.encode(proxyTicket, "UTF-8");
String proxyResponse = CommonUtils.getResponseFromServer(serviceUrl, "UTF-8");

但是proxyTicketnull!我必须做什么(可能在我的客户端应用程序cas设置中)才能让它工作?
另外,我是sso新手,不知道这是否是调用外部rest api的唯一方法。我从firefox手动获取外部rest服务的JSESSIONID cookie,并以某种方式在我的应用代码中的请求中设置它,可以获得响应,但不知道如何自动完成这一操作?

1dkrff03

1dkrff031#

如果需要调用其他服务的API,是否需要以登录用户的身份发出请求?通常,服务到服务的调用使用计算机标记,而不是用户标记。如果需要用户上下文,则可以考虑将JWT作为服务票证:
https://apereo.github.io/cas/6.0.x/installation/JWT-Authentication.html
您可以将JWT传递给其他服务的API以提供用户上下文,但我建议使用不同形式的身份验证,因为它将允许具有有效JWT的任何人调用您的服务的API。

vmpqdwk3

vmpqdwk32#

我喜欢@creamstout10的答案,我认为这是一条路要走,虽然我一直在使用CAS协议代理票据的方法,以服务的服务调用与旧版本的CAS。
不指定正在使用的CAS客户端。在所有情况下,如果未获得代理票证,通常需要正确配置代理接收器URL,以便CAS服务器可以调用它(要进行确认,请检查CAS服务器日志中的错误)。例如,如果正在直接使用java cas客户端,请检查此处的***proxyReceptorUrl***属性:
https://github.com/apereo/java-cas-client#orgapereocasclientvalidationcas20proxyreceivingticketvalidationfilter
如果使用spring-security-cas,您应该查看该模块文档,了解Spring config中这些属性设置

相关问题