spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

Posted

技术标签:

【中文标题】spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务【英文标题】:spring boot - feign client sending on basic authorization header| Pass jwt token from one microservice to another 【发布时间】:2018-09-12 12:53:24 【问题描述】:

我正在使用 Spring Boot 创建一个基于微服务的项目。 我使用 eureka 服务器进行服务发现和注册,还使用 ​​JWT 进行身份验证以进行授权和身份验证。 每个微服务都有 jwt 验证,并且在控制器上实现了全局方法安全性 我正在使用 feign 客户端进行微服务间调用。

服务 - 1)主要请求服务 2)审批服务;

审批者服务正在调用主服务以调用只能由 ADMIN 访问的方法 但是当在主请求服务端处理 jwt 验证时..我只能在 Headers 中看到基本授权标头。

我正在从我的审批者服务传递 JWT 令牌 在approverservice中伪装客户端

@FeignClient("MAINREQUESTSERVICE")
public interface MainRequestClient 
	
	@RequestMapping(method=RequestMethod.POST, value="/rest/mainrequest/changestatus/status/id/requestid")
	public String changeRequestStatus(@RequestHeader("Authorization") String token,@PathVariable("requestid")int requestid,@PathVariable("status") String status);

从请求中读取标头的代码

@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException 
		HttpServletRequest request=(HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) res;
		String header = request.getHeader("Authorization");
		System.out.println("header is "+header);
		if (header == null || !header.startsWith("Bearer")) 
			chain.doFilter(request, res);
			return;
		

		UsernamePasswordAuthenticationToken authentication = getAuthentication(request);
		SecurityContextHolder.getContext().setAuthentication(authentication);
		chain.doFilter(request, response);
		
	

在调试此过滤器时,我已在控制台上打印了令牌 Header when debugged in main request service

那么我可以就如何将我的 JWT 令牌从一个微服务传递到另一个微服务获得帮助?

【问题讨论】:

您是如何生成 JWT 令牌的?您是如何构建 Feign 目标的? 【参考方案1】:

试试这个(代码基于https://medium.com/@IlyasKeser/feignclient-interceptor-for-bearer-token-oauth-f45997673a1)

@组件 公共类 FeignClientInterceptor 实现 RequestInterceptor

private static final String AUTHORIZATION_HEADER="Authorization";
private static final String TOKEN_TYPE = "Bearer";

@Override
public void apply(RequestTemplate template) 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    if (authentication != null && authentication instanceof JwtAuthenticationToken) 
        JwtAuthenticationToken token = (JwtAuthenticationToken) authentication;
        template.header(AUTHORIZATION_HEADER, String.format("%s %s", TOKEN_TYPE, token.getToken().getTokenValue()));
    

【讨论】:

以上是关于spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:在标头中发送 JWT(OAuth)

spring boot整合jwt 实现前后端分离登录认证及授权

spring boot项目之微信支付功能实现详细介绍

Spring Boot 微服务授权

面向公共客户端的 Spring Boot 2 授权服务器 (PKCE)

springboot发送邮件免授权码