Цель в том, чтобы несколько устройств могли работать с разными токенами независимо друг от друга. Оказалось, что в Spring OAuth у нас не может быть одного токена обновления с несколькими токенами доступа, связанными с ним. Также оказалось, что такой конфигурации не было необходимости; если у нас могут быть отдельные аутентификации для отдельных устройств, этого будет достаточно . Теперь генерируется ключ ( DefaultAuthenticationKeyGenerator ) на основе client_id, области действия и имени пользователя. Поскольку я не использую область, я просто поместил информацию об устройстве в область и получил следующее:
{
"access_token": "32e11a1b-cb9f-4317-95b0-e850f260d160",
"token_type": "bearer",
"refresh_token": "d097e4ea-a9d9-4e0c-94cd-7c15e1c8e690",
"expires_in": 3599,
"scope": "android2",
"exp": 1557843628674
}
Чтобы это произошло, просто пропустите конфигурацию области следующим образом:
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
configurer
.inMemory()
.withClient(CLIENT_ID)
.secret(passwordEncoder.encode(CLIENT_SECRET))
.authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN, IMPLICIT)
// ************* Comment this out ******
//.scopes(SCOPE_READ, SCOPE_WRITE, TRUST)
.accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS).
refreshTokenValiditySeconds(REFRESH_TOKEN_VALIDITY_SECONDS);
}
Используя этот метод, каждое устройство может получить отдельный токен. Кроме того, когда пользователь выходит из системы, у нас есть возможность выхода из него со всех его устройств.
Однако мы не можем не указывать область действия в наших запросах ; параметр области всегда должен отправляться в запросах на обновление токена.