我想将Netflix Zuul 2(https://github.com/Netflix/zuul)放在我的服务前面,并对传入的请求进行一些身份验证/确认。
通过API网关的每个请求,例如/api/service1/value
将具有auth令牌,我想先验证该令牌,然后再将请求路由到适当的后端服务。
我有几个问题,希望有人能指出我正确的方向。
入站筛选器似乎是放置该逻辑的正确位置。 目前,我的理解是可以这样做:
class RequestAuthenticationFilter extends HttpInboundSyncFilter {
@Override
HttpRequestMessage apply(HttpRequestMessage request) {
// extract header with token and call auth service to validate it
if (ifTokenNotValid) {
// returns a 401
request.getContext()
.setEndpoint(UnauthorizedRequestEndpoint.class.getCanonicalName())
}
// continue filter chain
return request
}
}
我不确定如何对auth服务进行调用,并在入站过滤器中获取响应,以便可以检查响应并采取适当的措施-返回401或继续路由/api/service1/value
向下游后端服务的请求。
是否存在用于从入站筛选器到服务的外部调用的标准方法?
我是否需要使用HttpClient等导入另一个库来实现此目的?
是否有其他/更好的方法来处理此流程?
我了解,对于从入站筛选器到端点的常规路由,可以使用ProxyEndpoint:
入站过滤器配置:
...
if (path in request matches) {
context.setEndpoint(ZuulEndPointRunner.PROXY_ENDPOINT_FILTER_NAME)
context.setRouteVIP("service1")
}
return request
任一Eureka配置:
service1.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
service1.ribbon.DeploymentContextBasedVipAddresses=authservice
或手动配置的服务器列表:
service1.ribbon.listOfServers=localhost:8080
service1.ribbon.client.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList