React keycloak TypeError: kc.updateToken(...).success 不是函数

Ami*_*ian 7 authentication single-sign-on reactjs keycloak react-hooks

我正在执行keycloak。

这是我的 keycloak 初始化配置:

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

export const keycloakInitConfig = {
  onLoad: 'login-required',
  promiseType: 'native',
  token,
  refreshToken,
};
Run Code Online (Sandbox Code Playgroud)

有时我收到此错误

TypeError: kc.updateToken(...).success 不是函数

如果有人可以帮助我,非常感谢。

更新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();
                            }
                        });
Run Code Online (Sandbox Code Playgroud)

我有这个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);
};
Run Code Online (Sandbox Code Playgroud)

和 KeycloakProvider

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

das*_*iko 6

您正在使用“旧”.success()方法,但您已promiseType: 'native'在 init 配置中使用本机承诺类型 ( ) 进行配置。

使用.then()标准Promise类型的标准方法,就像我这里的例子一样,它应该可以工作:https : //github.com/dasniko/keycloak-reactjs-demo/blob/master/src/index.js#L48-L49

  • 不,请不要!随着 Keycloak 8.x 原生 Promise 成为默认值,旧版 Promise 支持(Keycloak 自己的实现)将被弃用。因此,原生 Promises 是正确的选择,只需使用 `.then()` 方法,而不是 `.success()`!(当然还有 `.catch()` 而不是 `.error()`) (2认同)

gol*_*nus 5

这是 keycloak-js 本身的问题,它将与 keycloak-js 8.0.0 版本一起发布。

此外,react-keycloak 内部不使用 .success() 。

有关该问题的更多详细信息,请参阅此处。 KEYCLOAK-8938

我建议您避免在设置中使用promiseType: 'native'。