1
resposta

[Bug] "jwt expired" Exception no método getAll

Durante a aula de Autorizando Requisições -> Mostrando entradas do usuário, me deparei com um erro que não foi tratado pelo Ricarth, então desenvolvi uma tratativa e vim compartilhar para quem possa ter encontrado o mesmo erro.

Durante essa aula desenvolvemos uma forma de verificar se o usuário está logado ou não usando as informações dele que salvamos localmente via SharedPreferences, logo se existe a combinação token-email-id salva, ele está logado e podemos pular a tela de login. Porém, existe um furo nessa lógica pois o token expira, e se ele estiver expirado ele continuará salvo localmente, o que causará com que o App pule a tela de login, porém não consiga realizar nenhuma requisição HTTP pois o token está expirado.

O que devemos fazer é, caso a requisição HTTP retorne erro com body "jwt expired", precisamos deletar essas informações do SharedPreferences e voltar pra tela de Login.

Essa foi a lógica que eu usei para fazer isso

No arquivo auth_service.dart, eu criei outra função similar a saveUserInfos, chamada deleteUserInfos

deleteUserInfos() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.remove("accessToken");
    prefs.remove("id");
    prefs.remove("email");
  }

Com essa função pronta, eu chamei ela no journal_service.dart dentro do método getAll, primeiro eu verifico se o erro foi "jwt expired", se for, chamo o deleteUserInfos

  Future<List<Journal>> getAll({required String id, required String token}) async {
    http.Response response = await client.get(
      Uri.parse(("${url}users/$id/journals")),
      headers: {"Authorization": "Bearer $token"});

    if (response.statusCode != 200) {
      //Se token salvo localmente estiver expirado, deleta e volta pra tela de login
      if (response.body.contains("jwt expired") ) {
        AuthService auth = AuthService();
        auth.deleteUserInfos();
      }
      throw Exception();
    }

    List<Journal> list = [];
    List<dynamic> listDynamic = json.decode(response.body);
    for (var jsonMap in listDynamic) {
      list.add(Journal.fromMap(jsonMap));
    }

    return list;
  }

Após isso, na próxima chamada do método refresh() o programa irá voltar pra tela de login ao invés de ficar preso na tela inicial porém não mostrando nada.

Deixando claro que isso não é uma crítica ao Ricarth, acredito que ele deixou esse caso passar batido porque no tempo que ele fez a aula o token não chegou a expirar então isso não aconteceu com ele, e acho que esses erros são bons para que a gente possa aprender a se virar sozinhos também kkkkkkk

1 resposta

Olá Victor!

Agradeço por compartilhar a solução que encontrou para lidar com o erro "jwt expired" no método getAll. É muito válido compartilhar essas soluções, pois podem ajudar outras pessoas que estejam enfrentando o mesmo problema.

A lógica que você utilizou, de verificar se o erro retornado pela requisição HTTP é "jwt expired" e, em caso afirmativo, deletar as informações do SharedPreferences e voltar para a tela de login, parece ser uma abordagem adequada para lidar com esse cenário.

É importante lembrar que os erros podem ocorrer em diferentes situações e é sempre bom estar preparado para tratá-los da melhor forma possível. Compartilhar soluções como essa é uma ótima maneira de aprender e ajudar a comunidade.

Continue assim, buscando soluções e compartilhando conhecimento! Se tiver mais alguma dúvida, estou à disposição.

Parabéns e bons estudos!