授权码授予类型的Spring zuul

问题描述 投票:1回答:1

我一直在尝试建立一个能在JWT上运行的Spring分布式应用。Github repo - https:/github.comdhananjay12spring-microservice-demo。

服务说明

  • 产品服务 : 具有受保护路线的简单下游服务
  • jwt-resoure-server : 一个jar,当它被包含在下游服务中时,它将成为一个资源服务器,提取jwt token并设置它的不安全contex。
  • eureka-service:一个jar,当它被包含在下游服务中时,会使它成为一个资源服务器,提取jwt token并设置它的不安全contex。发现服务
  • zuul-server : 边缘服务器
  • Okta是我的认证服务器

我已经将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;
    }
}
spring spring-security oauth-2.0 netflix-zuul api-gateway
1个回答
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

这篇文章 进一步详细解释了上述内容。

© www.soinside.com 2019 - 2024. All rights reserved.