Токен множественного доступа с одним токеном обновления - PullRequest
0 голосов
/ 12 мая 2019

У меня есть несколько мобильных клиентов, и все они аутентифицируются с использованием потока предоставления пароля. Для этого я просто хочу использовать один очень длительный токен обновления с несколькими короткоживущими токенами доступа. Я пытался сгенерировать токены множественного доступа с помощью Password Grant весной, однако каждый раз, когда я обновляю свой токен доступа, старый токен доступа перестает работать. Я проверил базу данных, и для этой конкретной аутентификации всегда есть только одна запись в таблице oauth_access_token. Разве Spring Oauth2 не должен генерировать токены множественного доступа для одного токена обновления? Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Цель в том, чтобы несколько устройств могли работать с разными токенами независимо друг от друга. Оказалось, что в 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);
    }

Используя этот метод, каждое устройство может получить отдельный токен. Кроме того, когда пользователь выходит из системы, у нас есть возможность выхода из него со всех его устройств. Однако мы не можем не указывать область действия в наших запросах ; параметр области всегда должен отправляться в запросах на обновление токена.

0 голосов
/ 13 мая 2019

Поддерживается спецификацией OAuth2, см. RFC 6749 :

1,5. Обновить токен

Токены обновления - это учетные данные, используемые для получения токенов доступа. обновление токены выдаются клиенту сервером авторизации и используется для получения нового токена доступа, когда текущий токен доступа становится недействительным или истекает, или для получения дополнительных токенов доступа с идентичной или более узкой областью действия (токены доступа могут иметь более короткий время жизни и меньше разрешений, чем разрешено ресурсом владелец).

Но Spring Security OAuth2 не поддерживает его, см. DefaultTokenServices#refreshAccessToken:

  // clear out any access tokens already associated with the refresh
  // token.
  tokenStore.removeAccessTokenUsingRefreshToken(refreshToken);

и TokenStore#removeAccessTokenUsingRefreshToken:

Удалите токен доступа, используя токен обновления. Эта функциональность необходима, поэтому токены обновления нельзя использовать для создания неограниченного количества токенов доступа.

Один из обходных путей - реализовать пользовательский TokenStore.

...