我一直在尝试建立一个能在JWT上运行的Spring分布式应用。Github repo - https:/github.comdhananjay12spring-microservice-demo。
服务说明
我已经将oauth授予类型设置为--授权代码(我知道对于温泉来说,建议使用隐式授予类型,但假设由于未来的一些限制,我们被限制在这个授予类型上。
所以Angular客户端成功登录后,Auth服务器用授权码重新返回到Angular应用中,如.net、.net等。
http:/localhost:4200?code=iTJkTvXfESQFvGJmio_l&state=my-state。
现在我必须用这段代码打到 auth 服务器,以获得访问权限和 id token。
由於這需要客戶端秘密,我必須透過zuul傳遞(因為只有後端服務才能擁有客戶端秘密),而zuul應該在body中加入client_secret,並把請求轉寄給auth伺服器。
我正在为最后这部分而苦恼。有什么见解吗?我试着创建了一个TokenFilter,但它对后置请求不起作用。https:/github.comdhananjay12spring-microservice-demotreemasterzuul-serversrcmainjavacommynotesmicroservicezuulserver。
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;
}
}
你需要使用一个重定向,保存授权码调用的代码。然后你需要使用这个保存的代码来调用令牌端点来获取访问令牌。
就像这样。
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
这篇文章 进一步详细解释了上述内容。