Keycloak e vue 3

Não estou conseguinco atualizar o token do Keycloak antes da requisição.

const store = useUsuarioStore();
const url = import.meta.env.VITE_APP_KEYCLOAK_URL;
const keycloak = new Keycloak({
  url,
  realm: "ecosistema",
  clientId: "app-vue",
});

keycloak.init({ onLoad: "login-required" }).then((auth) => {
  if (!auth) {
    window.location.reload();
  } else {
    console.log("Authenticated");
  }

  keycloak.loadUserProfile().then((profile) => {
    console.log(`profile is ${JSON.stringify(profile) as string}`);
    localStorage.setItem("token", keycloak.token as string);
    localStorage.setItem("refreshToken", keycloak.refreshToken as string);
    localStorage.setItem("user", keycloak.refreshToken as string);
    localStorage.setItem("profile", JSON.stringify(profile));
    store.fetchUsuarioLogado();
  });

  setInterval(() => {
    keycloak
      .updateToken(30)
      .then((refreshed) => {
        if (refreshed) {
          console.log("Token refreshed" + refreshed);
        } else {
          let tokenParsed: number = 0;
          let timeSkew: any = 0;
          if (keycloak) {
            if (keycloak?.tokenParsed?.exp) {
              tokenParsed = keycloak?.tokenParsed?.exp;
            }
            if (keycloak?.tokenParsed?.exp) {
              timeSkew = keycloak?.timeSkew;
            }
          }
          console.log(
            "Token not refreshed, valid for " +
              Math.round(tokenParsed + timeSkew - new Date().getTime() / 1000) +
              " seconds"
          );
        }
      })
      .catch(() => {
        console.log("Failed to refresh token");
      });
  }, 60000);
});

Como ajustar ?

Acontece algum erro?

1 curtida

O erro é que o token parece que não atualizar.

Nesta parte
if (refreshed) {
sempre é false

Assim só mostra esta mensagem
console.log(
"Token not refreshed, valid for " +
Math.round(tokenParsed + timeSkew - new Date().getTime() / 1000) +
“seconds”
);

Ai depois que erro 401, aperto F5, o token é atualizado e volta a funcionar.

1 curtida

Pelo que li nas docs, essa função updateToken recebe o tempo em segundos. Dependendo do tempo de vida configurada para o token, ele não será atualizado à menos que esteja faltando 30 segundos para expirar, no seu caso. Por exemplo, se o tempo de vida do token é 5 minutos, e a função updateToken é chamada passando 30, e o token ainda possui mais de 30 segundos de vida restando, o boolean retornado será false.

Bom, isso é o que entendo e pelo que li nas docs, mas posso ter interpretado algo errado, e usei keycloak poucas vezes também. Talvez alguém com mais experiência no fórum possa ajudar.

Referência: Securing Applications and Services Guide - pesquise na página por updateToken(minValidity)

1 curtida

Acho que entendi.
Vou ver como está a configuração e refazer os testes