Реагировать на Keycloak TypeError: kc.updateToken (...). Успех не является функцией - PullRequest
4 голосов
/ 17 октября 2019

Я был на реализации keycloak.

Это моя конфигурация инициализации keycloak:

const token = localStorage.getItem('kc_token');
const refreshToken = localStorage.getItem('kc_refreshToken');

export const keycloakInitConfig = {
  onLoad: 'login-required',
  promiseType: 'native',
  token,
  refreshToken,
};

И иногда я получал эту ошибку

Ошибка типа: kc. updateToken (...). успех не является функцией

, если кто-нибудь может мне помочь, очень спасибо.

ОБНОВЛЕНИЕ 1:

                        kc.updateToken(-1).success(function() {
                            kc.onAuthSuccess && kc.onAuthSuccess();
                            initPromise.setSuccess();
                        }).error(function() {
                            kc.onAuthError && kc.onAuthError();
                            if (initOptions.onLoad) {
                                onLoad();
                            } else {
                                initPromise.setError();
                            }
                        });

У меня есть это в node_modules, и моя keycloak-js версия 6.0.0.

ОБНОВЛЕНИЕ 2:

export const keycloakInitConfig = {
  onLoad: 'login-required',
  promiseType: 'native',
  token,
  refreshToken,
};

export const onKeycloakEvent = (store) => (event, error) => {
  console.log('event?????', event);
  if (event === 'onAuthSuccess') {
    keycloak.loadUserProfile()
      .then((userInfo) => {
        store.dispatch({
          type: actionTypes.SET_USER_INFO,
          payload: { user: userInfo },
        });
      })
      .catch((err) => {
        console.log('loadUserProfile: ', err);

        localStorage.removeItem('kc_token');
        localStorage.removeItem('kc_idToken');
        localStorage.removeItem('kc_refreshToken');

        store.dispatch({
          type: actionTypes.LOG_OUT,
        });

        keycloak.logout();
      });
  } else if (error) {
    console.log('onKeycloakEvent', event, error);
  }
};

export const onKeycloakTokens = (tokens) => {
  localStorage.setItem('kc_token', tokens.token);
  localStorage.setItem('kc_idToken', tokens.idToken);
  localStorage.setItem('kc_refreshToken', tokens.refreshToken);
};

И KeycloakProvider

ReactDOM.render(
  <KeycloakProvider
    keycloak={keycloak}
    initConfig={keycloakInitConfig}
    onEvent={onKeycloakEvent(store)}
    onTokens={onKeycloakTokens}
  >
    ...
  </KeycloakProvider>,
  document.getElementById('root'),
);

Ответы [ 2 ]

3 голосов
/ 27 октября 2019

Это проблема с самим keycloak-js, и он установлен для выпуска с версией keycloak-js 8.0.0.

Также response-keycloak не использует .success () для внутреннего использования.

Смотрите здесь для более подробной информации о проблеме. KEYCLOAK-8938

Я бы посоветовал вам избегать использования обещания типа: «родной» в вашей настройке.

3 голосов
/ 19 октября 2019

Вы используете «старый» метод .success(), но вы сконфигурировали, используя собственные типы обещаний (promiseType: 'native') в конфигурации init.

Используйте стандартный .then() метод стандарта Promiseвведите, как в моем примере здесь, и он должен работать: https://github.com/dasniko/keycloak-reactjs-demo/blob/master/src/index.js#L48-L49

...