如何使用refresh_token

时间:2019-05-01 06:56:57

标签: java spring-boot oauth-2.0 spring-cloud-netflix

我们正在使用Spring Cloud Netflix Zull作为我们后端服务的网关应用程序。前端是Angular。但是我们仅在Postman中测试端点(前端正在开发中)。我们有一个名为LoginServiceModule的模块,另一个是ZullServerModuleLoginSericeModuke从前端获取用户名和密码,并通过包括所需的标头和正文来调用以下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调用上一个调用。

1 个答案:

答案 0 :(得分:2)

通常,由客户端负责维护自己的令牌并在令牌即将到期时对其进行刷新。将此逻辑移到Zuul层中似乎是个坏主意。仔细考虑一下实现,它将如何工作?

一旦客户的令牌过期,它将使用永久过期的令牌来调用您的端点,Zuul将不得不尝试对每个请求进行刷新。这将增加每个API调用的开销。您可能会引入某种黑客手段,在这种情况下,您总是在响应标头或其他内容中传回新令牌……但是,此时您将违反authorization flow of OAuth2