Как получить доступ к внешнему URL, который требует OAuth2 через Spring Boot? - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время механизм, который мы используем для аутентификации на сервере, который требует OAuth2, заключается в написании Java-программы, содержащей метод main (), который запускает HttpClient для генерации токена доступа OAuth2 с помощью этого вызова:

https://api.externalsite.com/v1/oauth/token?clientId=iLHuXeULFBdW4B1dmRY0MhFILRQnlfeK&clientSecret=RG3JanXEq2R1GhRvIQ2d2AKRx0SORvb3&grant_type=client_credentials

Возвращает следующую полезную нагрузку JSON:

{
    "access_token": "eyJhbGciOi786I1NiJ9.eyJ1c2VybmFtZSI6bnVsbCwiZGV2aWNlSWQiOm51bGwsImNsaWVudElkIjoiaUxIdVhlVUxGQmRXNEIxZG1SWTBNaFJPTVJRbmxmZUsiLCJhZElkIjpudWxsLCJleHAiOjE1MjU0MjY4LMYsImlhdCI6MTUyNTQyMzE0Nn0.Zz_uhXqOF2ykC24mNBWHnQ_Vmx-jfQs3X4qcmmN0-Sk",
    "token_type": "Bearer",
    "expires_in": 3600,
    "refresh_token": null,
    "scope": null
}

После получения токена доступа мы можем выполнять запросы с использованием JSON к авторизованному веб-сайту / сервису.


Вопрос (ы):

  1. Внутри микросервиса Spring Boot (2.0.1.RELEASE), как можно использовать Spring Security или просто HttpClient для использования clientId, clientSecret и grant_type для автоматического предоставления маркера глобального доступа внутри каждого вызова REST (который может быть HTTP Post) из уровня контроллера REST?

  2. Может кто-нибудь показать пример кода того, как использовать Spring Security или другую библиотеку, чтобы просто отправить clientId, clientSecret и grant_type для получения токена доступа OAuth2?

  3. Что делать (используя библиотеку из вопроса № 2), если срок действия токена OAuth2 истекает?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Найден OAuth2Client, открытый IBM и предлагаемый IBM:

https://www.ibm.com/developerworks/library/se-oauthjavapt1/index.html#download

0 голосов
/ 11 мая 2018

Также, только что использовал RestTemplate:

String accessToken = OAuth2Client.generateAccessToken();
RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);

HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String response = restTemplate.postForObject(url, entity, String.class);

Очень просто!

0 голосов
/ 04 мая 2018

1) Вам не нужна весенняя защита. Просто используйте «io.jsonwebtoken.Jwts». Вы можете использовать любое количество параметров для генерации токена JWT. Вы можете использовать компонент внутри вашего загрузочного приложения Spring для генерации токена JWT.

Затем создайте службу токена, которая будет использовать этот компонент и выполните следующие действия: сгенерируйте токен доступа, проверьте токен доступа и обновите токен.

2) Образец : @Составная часть public String createJwtToken (пользователь, тип TokenType, ClientKey clientKey) генерирует исключение InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {

   String userName = user.getUsername();

   Date currentTime = new Date();

   String token = Jwts.builder()
     .setSubject(userName)
     .claim(Constants.NAME_KEY, Constants.NAME_VALUE)
     .claim(Constants.USER_TOKEN_KEY, clientKey.getKey())
     .claim(Constants.SCOPE_KEY, Constants.SCOPE_VALUE)
     .claim(Constants.TOKEN_TYPE, type.name())
     .setIssuer(tokenIssuer)
     .setHeaderParam(Constants.TOKEN_TYP, Constants.TOKEN_JWT)
     .setHeaderParam(Constants.TOKEN_TYPE, type.name())
     .setIssuedAt(currentTime)
     .setExpiration(timeout(type))
     .signWith(SignatureAlgorithm.HS256, key)
     .compact();
   return encrypt(token);

}

3) Каждый раз, когда вы генерируете токен в первый раз, вы генерируете 2 токена: accessToken и Refresh Token. AccessToken недолговечен и скоро истекает. - скажем 5 минут. Токен обновления имеет срок действия onger: например: 20 минут.

Назначение токена обновления состоит в том, что вы можете использовать токен обновления для генерации нового токена доступа. Поэтому, когда срок действия вашего маркера доступа истекает, просто вызовите метод обновления маркера, передав ему токен обновления. Этот метод должен вернуть пользователя из redis с новым токеном доступа.

С уважением,

R Rai

...