【发布时间】:2019-01-09 18:54:24
【问题描述】:
我一直在尝试构建一个适用于 JWT 的 Spring 分布式应用程序。 Github 仓库 - https://github.com/dhananjay12/spring-microservice-demo
服务说明
- product-service : 具有受保护路由的简单下游服务
- jwt-resoure-server : 包含在下游服务中的 jar 使其成为提取 jwt 令牌并将其设置为的资源服务器 安全环境。
- eureka-service : 发现服务
- zuul-server : 边缘服务器
- Okta 是我的身份验证服务器
我已将 oauth 授权类型设置为 - 授权码(我知道建议使用 spa 隐式授权类型,但可以说由于未来的某些限制,我们仅限于这种授权类型)
所以 Angular 客户端在成功登录后,身份验证服务器会使用以下授权代码恢复为 Angular 应用程序:
http://localhost:4200/?code=iTJkTvXfESQFvGJmio_l&state=my-state
现在我必须使用此代码访问身份验证服务器以获取访问和 id 令牌。
由于这需要客户端密码,我必须通过 zuul 传递它(因为只有后端服务可以拥有客户端密码),它应该将 client_secret 添加到正文并将请求转发到身份验证服务器。
我正在为最后一部分苦苦挣扎。有什么见解吗?尝试创建一个 TokenFilter,但它不适用于发布请求。 https://github.com/dhananjay12/spring-microservice-demo/tree/master/zuul-server/src/main/java/com/mynotes/microservice/zuulserver
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import java.io.IOException;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.FORWARD_TO_KEY;
import javax.servlet.http.HttpServletRequest;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
@Component
public class TokenFilter extends ZuulFilter {
@Autowired
private OauthConfiguration oauthConfiguration;
@Override
public int filterOrder() {
return 6;//PRE_DECORATION_FILTER_ORDER - 1;
}
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if (request.getRequestURI().contains("/token")) {
return true;
}
return false;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
request.setAttribute("client_secret", oauthConfiguration.getClientSecret());
System.out.println(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
return null;
}
}
【问题讨论】:
-
为什么说隐式授权类型优于授权码? AC 提供更多安全性,隐式授权的优势仅在于净流量(相当轻微),AFAIK。我也不明白最后一部分。从我的角度来看,现在的流程应该是将客户端密码附加到代码中,无论是在服务器中还是在 JS 中(为什么 zuul 应该这样做?)。
-
客户端密码只能在服务器上。您是否建议我为这些令牌编写另一项服务来与我的身份验证服务器(当前为 okta)通信?我认为 zuul 中可能有一种方法,因为它已经有了客户端密码,它需要做的就是在附加 cleint_secret 之后路由请求。
-
在我看来,它应该是应用程序(keycloak 背后的那个),它知道它的客户端密码,也就是请求访问令牌的那个。如果 zuul 这样做了,你就让 zuul 成为客户端,这一点也不差,但是,如果你需要在它后面放另一个应用程序怎么办? digitalocean.com/community/tutorials/…
标签: spring spring-security oauth-2.0 netflix-zuul api-gateway