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 - 授权代码授予始终需要客户端密码