我正在尝试使用zuul代理服务器实现API网关。 基本上,我想要实现的是当客户端通过网关发送请求来资源服务器时,网关只检查客户端会话是否存在,如果不存在,它将重定向到 SSO 服务器进行身份验证。但是,Zuul过滤器总是进入资源服务器而不重定向到SSO服务器。
下面的是用于重定向到远程SSO的剪切代码
public Object run() {
try {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
// step 1: check to see whether session exist, if not redirect to federation for authentication
// if session already exist then adding sessionId to cookie to forwarding to targeting service
// TODO: comment out for now.
HttpSession currentSession = context.getRequest().getSession(false);
String samlAuthenWithRelayUrl = populateFedUrlWithRelay(request);
if (currentSession==null){
// redirect to federation with relay URL
context.setRouteHost( new URL(samlAuthenWithRelayUrl));
//response.sendRedirect(samlAuthenWithRelayUrl);
} else{
HttpSession httpSession =request.getSession();
context.addZuulRequestHeader(AppConstants.PHOENIX_COOKIE, "SESSION=" + httpSession.getId());
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
// redirect to error page
}
return null;
}
请告知是否有任何遗漏的部分来实现我的目标,谢谢。
答案 0 :(得分:1)
API网关永远不应重定向到单点登录服务IMO。网关不是要从浏览器访问,而是从REST客户端库或Postman之类的工具访问。如果身份验证失败,则应返回401响应,而不是302。
UNRELATED:如果您有某种使用REST API的服务器端Web UI框架(例如JSF),请阅读
对于对视图(UI服务)的请求,我遇到了与Zuul和Keycloak SSO类似的问题。我无法获得Zuul背后的UI服务,正确执行OpenIdConnect标准流程。我最终只使用Zuul用于Rest API,并让最终用户浏览器直接向UI服务发出请求(我有一个实例)。
在Keycloak mailing list和what I tried中描述了我的问题,以便在此Github回购中修复它。