我一直在尝试构建可在JWT上运行的spring分布式应用程序。 Github仓库-https://github.com/dhananjay12/spring-microservice-demo
服务说明
我已将oauth授予类型设置为-授权代码(我知道建议使用spa隐式授予类型,但由于将来受到一些限制,我们只能使用此授予类型)
因此,角度客户端成功登录后,身份验证服务器会使用授权代码(如:)还原到角度应用,
http://localhost:4200/?code=iTJkTvXfESQFvGJmio_l&state=my-state
现在,我必须使用此代码来访问身份验证服务器,以获取访问权限和ID令牌。
因为这需要客户端密钥,所以我必须将其通过zuul传递(因为只有后端服务才能具有客户端密钥),这应该将client_secret添加到主体并将请求转发到auth服务器。
我正在为最后一部分而苦苦挣扎。有什么见解吗?尝试创建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;
}
}
答案 0 :(得分:0)
您将需要使用重定向来保存授权代码调用中的代码。然后,您将需要使用此保存的代码来调用令牌端点,以获取访问令牌。
类似这样的东西:
zuul:
routes:
auth/code:
path: /auth/code/**
sensitiveHeaders:
url: auth end point
auth/token:
path: /auth/token/**
sensitiveHeaders:
url: token end point
auth/redirect:
path: /auth/redirect/**
sensitiveHeaders:
url: base url
This article详细解释了上述内容。