Поговорите с токеном OAuth 2.0 Expire_in

Java

фон проблемы

Одноклассник задал такой вопрос через личное сообщение, посетите pig4cloudдемонстрационная среда[1]Просмотр запроса на вход и ответное сообщение сети выглядит следующим образом:

{
    "access_token":"16d35799-9cbb-4c23-966d-ab606029a623",
    "token_type":"bearer",
    "refresh_token":"495dbde5-1bbb-43c9-b06b-ecac50aa5d53",
    "expires_in":41000,
    "scope":"server"
}

Когда выполняется локальное развертывание, сообщение, возвращаемое запросом на вход, выглядит следующим образом:

{
    "access_token":"c262afbe-441e-4023-afb4-f88c8a0a7d51",
    "token_type":"bearer",
    "refresh_token":"ea642d50-5cf5-48ad-9ef9-cb57c9dde00a",
    "scope":"server"
}

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

Анализ исходного кода

Давайте посмотрим на механизм метода токена oauth 2. Если validSeconds (период действия токена), настроенный клиентом, больше 0, будет возвращен параметр expires_in текущего времени действия токена.

OAuth2AccessToken createAccessToken() {
  DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
  int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());
  if (validitySeconds > 0) {
    token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));
  }
  token.setRefreshToken(refreshToken);
  token.setScope(authentication.getOAuth2Request().getScope());

return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token; }

  • Когда tokenStore сохраняет токен, если параметр истечения равен 0 или меньше 0. Срок действия пуст, время действия не будет установлено, что означает, что он действует постоянно, поэтому клиент не будет реагировать на параметр expires_in в это время.
if (token.getExpiration() != null) {
  int seconds = token.getExpiresIn();
  conn.expire(accessKey, seconds);
  conn.expire(authKey, seconds);
  conn.expire(authToAccessKey, seconds);
  conn.expire(clientId, seconds);
  conn.expire(approvalKey, seconds);
}

Должен ли постоянно действующий токен возвращать параметр expires_in?

Давайте сначала посмотримспецификация протокола oauth2[2]

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{ "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3", "token_type":"bearer", "expires_in":3600, "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk", "scope":"create" }

  • access_token (обязательно) токен доступа, выданный сервером авторизации
  • token_type (обязательно) Это тип токена, обычно просто строка "bearer".
  • expires_in (рекомендуется) Время истечения срока действия токена доступа.
  • refresh_token (необязательный) токен обновления, который можно использовать для обновления после истечения срока действия токена доступа.
  • scope (необязательный) Этот параметр является необязательным, если пользователь предоставил ту же область, запрошенную приложением.

Здесь expires_in рекомендуется возвращать, независимо от того, есть ли установленное ограничение срока действия или нет ограничения срока действия. Таким образом, обработка spring security oauth2 здесь не соответствует спецификации протокола emmm.

image
image

Reference

[1]

Демонстрационная среда:https://pigx.pig4cloud.com

[2]

Спецификация протокола oauth2:https://www.oauth.com/oauth2-servers/access-tokens/access-token-response/