Spring zuul 用于授权码授予类型

Posted

技术标签:

【中文标题】Spring zuul 用于授权码授予类型【英文标题】:Spring zuul for authorization code grant type 【发布时间】: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/… 【参考方案1】:

您需要使用重定向来保存来自授权代码调用的代码。然后,您需要使用此保存的代码调用令牌端点以获取访问令牌。

类似这样的:

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

【讨论】:

以上是关于Spring zuul 用于授权码授予类型的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security OAuth 2.0 - 授权代码授予始终需要客户端密码

oAuth2 的授权码授予类型

隐式授权工作流程与仅用于身份验证的授权代码授予的缺点?

获得具有授权码授予的 3-Leged Token 会给出错误 AUTH-004

OAuth 2 中隐式授权类型的目的是啥?

使用 Keycloak 作为授权服务器,Zuul 作为 API 网关