Различение запросов, исходящих от разных клиентов в рамках OAuth2 Springboot - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть 3 разных клиента, скажем, мобильный, веб, iot. Я использую grant_type = password и получаю accessToken. Я получаю запросы GET /access/resource от всех клиентов. Я хочу обрабатывать их по-разному в зависимости от их идентификатора клиента. Я знаю /oauth/check_token отвечает с client_id, но как извлечь его на сервере ресурсов

1 Ответ

0 голосов
/ 05 апреля 2020

Используйте JWT, когда сервер авторизации создает токен, по умолчанию AccessTokenConverter реализация DefaultAccessTokenConverter метод convertAccessToken делает: "response.put(this.clientIdAttribute, clientToken.getClientId());", чтобы токен также включал идентификатор клиента. Вышеупомянутый response - это просто хэш-карта, которая будет конвертирована в JWT.

Когда ваш сервер ресурсов попадет на GET /access/resource:

@RequestMapping("/access/resource")
public @ResponseBody Map<String,Object> getRes() throws IOException {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    ObjectMapper objMapper = new ObjectMapper();
    Map<String,Object> map = objMapper.convertValue(auth.getDetails(),Map.class);
    Jwt jwt = JwtHelper.decode((String) map.get("tokenValue"));
    Map<String,Object> claims = objMapper.readValue(jwt.getClaims(),Map.class);

    // This is what you want
    String clnt_id = (String) claims.get("client_id"); <<------- here

    // your logic here based on clnt_id
    // ex: if(clnt_id.equals("Specific client"){}
     ...

    return Collections.emptyMap();;
}

ИЛИ

OAuth2Request также включает в себя разрешенный идентификатор клиента:

Authentication auth = 
SecurityContextHolder.getContext().getAuthentication();
String cliend_id = ((OAuth2Authentication) auth).getOAuth2Request().getClientId()

Эта опция может быть применена, даже если JWT не используется, поскольку Oauth2request всегда там.

Посмотрите здесь чтобы лучше понять:

See client ids

...