Почему поток кода IdentityServer 4 получает ответ invalid_grant несколько раз позже?

Я использую поток кода identityserver4 для своего углового приложения. Я использую библиотеку angular-oauth2-oidc.

Моя конфигурация такова:

   OauthConfig: AuthConfig = {
        issuer: 'http://mydomain.identityserver4',
        requireHttps: false,
        responseType: "code",
        redirectUri: window.location.origin + '/index.html',
        clientId: 'dev.code.flow',
        scope: 'openid profile offline_access my.api',
        logoutUrl: window.location.origin + '/index.html',
        postLogoutRedirectUri: window.location.origin + '/index.html'
    }

  private configureOauth(){
    this.oauthService.configure(OauthConfig);
    this.oauthService.tokenValidationHandler = new JwksValidationHandler();
    this.oauthService.loadDiscoveryDocumentAndLogin();
    this.oauthService.setupAutomaticSilentRefresh();
  }

После входа в приложение библиотека отправляет запрос токена обновления каждые 5 минут. Я вижу это в инструментах разработчика Chrome.

Но через несколько часов запрос на обновление токена получает ошибку 400 (неверный запрос). Сообщение об ошибке: error: "invalid_grant"

Что может быть причиной этого?


person barteloma    schedule 31.08.2020    source источник
comment
Вот интересная статья о возможных причинах (пример с интеграцией с Google): blog.timekit.io/   -  person MoxxiManagarm    schedule 31.08.2020


Ответы (1)


В соответствии с протоколом OAuth2.0 и токен обновления, и токен доступа имеют ограниченное время жизни.

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

  • Увеличьте время жизни Refresh Token (как правило, они долговечны и должны обрабатываться безопасно)
  • Попросите пользователя снова войти в систему.
  • Можно использовать скользящий режим экспирации.

Это из документации IdentityServer4 (ссылка ):

AbsoluteRefreshTokenLifetime: максимальное время жизни токена обновления в секундах. По умолчанию 2592000 секунд/30 дней. Zero позволяет использовать токены обновления, которые при использовании с RefreshTokenExpiration = Sliding истекают только после прохождения SlidingRefreshTokenLifetime.

Вы можете настроить время ожидания токена обновления в конфигурации клиента IdentityServer4.

Вот метод, который я использовал для перенаправления пользователя на страницу входа:

setupAutomaticLogoutInCaseOfTokenExpiry() {
    if (!this.oauthService.events) {
      return;
    }

    this.oauthService.events.subscribe((x: any) => {
      if (x.type === 'token_refresh_error') {
        // In case of internet connectivity
        if (x.reason && x.reason.error && x.reason.error.error === 'invalid_grant' &&
            x.reason.error.error_reason === 'refresh_token_not_found') {
          this.oauthService.logOut(true);
          (window as any).removeAllListeners();
          this.router.navigateByUrl(`/${Constants.PageUrls.Login}`);
        } else {
          // In case of no internet connectivity
          this.oauthService.stopAutomaticRefresh();
          const rereshTimeout = setTimeout(() => {
            this.oauthService.refreshToken().then(() => {
              this.oauthService.setupAutomaticSilentRefresh();
              clearTimeout(rereshTimeout);
            })
            .catch(() => {
              clearTimeout(rereshTimeout);
            });
          }, 5000);
        }
      }
    });
}
person Prateek Pandey    schedule 31.08.2020
comment
Есть ли какое-либо событие для проверки истечения срока действия токена обновления в библиотеке angular-oauth2-oidc для перенаправления экрана входа в систему? - person barteloma; 31.08.2020
comment
Я столкнулся с подобной проблемой год назад и использовал метод (я только что упомянул в посте). Вы можете попробовать это. - person Prateek Pandey; 31.08.2020
comment
@barteloma, если этот пост решил вашу проблему, отметьте его как принятый ответ. - person Prateek Pandey; 06.09.2020