我们正在使用Spring Cloud Netflix Zull作为我们后端服务的网关应用程序。前端是Angular。但是我们仅在Postman中测试端点(前端正在开发中)。我们有一个名为LoginServiceModule
的模块,另一个是ZullServerModule
。 LoginSericeModuke
从前端获取用户名和密码,并通过包括所需的标头和正文来调用以下oauth / token端点。
http://localhost:XXXX/login
响应为
{
"access_token": "XXXXXXXXX",
"token_type": "bearer",
"refresh_token": "XXXXXXXXX",
"expires_in": 3600,
"scope": "read write",
"jti": "XXXXXXXXXXX"
}
和ZullServerModule
包含ZullServerConfiguration,授权服务器配置和资源服务器配置等...
LoginModule
内部这样调用oauth / token端点。
ResponseEntity<String> loginResponse = restTemplate.exchange("http://localhost:XXXX/oauth/token", HttpMethod.POST, entity, String.class);
响应是..
{
"access_token": "XXXXXXXXX",
"token_type": "bearer",
"refresh_token": "XXXXXXXXX",
"expires_in": 3600,
"scope": "read write",
"jti": "XXXXXXXXXXX"
}
我们从响应中提取access_token并调用以下端点...
http://localhost:XXXX/ProjectName/api/endpointname?access_token={access_token}.
但是当access_token到期时,以及当我访问上述后端服务网址时,它的说法
{
"error": "invalid_token",
"error_description": "Access token expired:XXXXXXXXXXXXXXX(access_token)"
}
我知道它已过期,并尝试像这样在终端中使用refresh_token重新生成access_token
curl clientID:clientSecret @ localhost:XXXX / oauth / token -d grant_type = refresh_token -drefresh_token = {refresh_token}
但是我需要将此包含在我们的代码中,并且不知道将其放置在何处。
在网上搜索后,我遇到了ZullFilter
。我尝试了所有前置,路由和后置过滤器。对于每个请求,它们都会执行(即,只要access_token不过期),但是当令牌过期时,如果我测试端点,则不会执行任何过滤器,并且会收到错误响应
{
"error": "invalid_token",
"error_description": "Access token expired: XXXXXXXXXX"
}
我已将sysouts放置在每个过滤器的run方法中。我对filterOrder也不太了解。
@Override
public Object run() throws ZuulException {
System.out.println("pre filter...");
RequestContext context =
RequestContext.getCurrentContext();
HttpServletResponse response = context.getResponse();
System.out.println(response.getStatus());
return null;
}
我想借助refresh_token来控制access_token的生成。每当access_token过期时,以及如果我访问过期后的资源时,我该如何编码,然后我才知道令牌已过期,并重新生成access_token并使用新的access_token调用上一个调用。
答案 0 :(得分:2)
通常,由客户端负责维护自己的令牌并在令牌即将到期时对其进行刷新。将此逻辑移到Zuul层中似乎是个坏主意。仔细考虑一下实现,它将如何工作?
一旦客户的令牌过期,它将使用永久过期的令牌来调用您的端点,Zuul将不得不尝试对每个请求进行刷新。这将增加每个API调用的开销。您可能会引入某种黑客手段,在这种情况下,您总是在响应标头或其他内容中传回新令牌……但是,此时您将违反authorization flow of OAuth2。