用于授权代码授予类型的Spring zuul

时间:2018-08-02 05:37:09

标签: spring spring-security oauth-2.0 netflix-zuul api-gateway

我一直在尝试构建可在JWT上运行的spring分布式应用程序。 Github仓库-https://github.com/dhananjay12/spring-microservice-demo

服务说明

  • 产品服务:具有受保护路线的简单下游服务
  • jwt-resoure-server:包含在下游服务中的jar 使其成为提取jwt令牌并将其设置在的资源服务器 安全区域。
  • eureka-service:发现服务
  • zuul-server:边缘服务器
  • Okta是我的身份验证服务器

我已将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;
    }
}

1 个答案:

答案 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详细解释了上述内容。