Как сгенерировать access_token в Oauth2.0 с refresh_token - PullRequest
2 голосов
/ 01 мая 2019

Мы используем 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.

1 Ответ

2 голосов
/ 01 мая 2019

Как правило, именно клиент отвечает за поддержание собственного токена и его обновление, когда срок его действия истекает.Перемещение этой логики в слой Zuul кажется очень плохой идеей.Подумайте о реализации на секунду, как это будет работать?

Как только срок действия токена клиента истечет, он будет вызывать ваши конечные точки с постоянно истекающим токеном, который Zuul должен будет пытаться обновлять при каждом запросе.Это добавило бы много накладных расходов для каждого вызова API.Возможно, вы могли бы ввести какой-то хак, когда вы всегда возвращаете новый токен в заголовке ответа или что-то в этом роде ... но на этом этапе вы нарушаете поток авторизации OAuth2 .

...