Мы используем Spring Cloud Netflix Zull в качестве шлюзового приложения для наших внутренних сервисов.Передняя часть угловая.Но мы тестируем конечные точки только в Postman (Front end находится в стадии разработки).У нас есть один модуль с именем 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 и когда я получаю доступ к вышеуказанному бэкэнд-сервисуurl, его поговорка
{
"error": "invalid_token",
"error_description": "Access token expired:XXXXXXXXXXXXXXX(access_token)"
}
Я знаю, что срок его действия истек, и я попытался сгенерировать access_token с помощью refresh_token в терминале, как это
curl clientID: clientSecret @ localhost: XXXX / oauth / token -d grant_type= refresh_token -drefresh_token = {refresh_token}
Но мне нужно включить это в наш код и не знаю, где его разместить.После поиска в сети я наткнулся на ZullFilter
.Я перепробовал все фильтры pre, route и post.Для каждого запроса они все выполняются (т.е. все, пока не истек срок действия 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;
}
Я хочу управлять генерацией access_token с помощью refresh_token.Как я могу кодировать это всякий раз, когда истекает access_token, и если я получаю доступ к ресурсам после истечения, тогда я узнаю, что токен истек, и заново генерирую access_token и вызываю предыдущий вызов с новым access_token.