Почему я получаю ошибку истечения срока действия токена websocket в моем приложении Hasura с использованием токенов Firebase JWT? - PullRequest
0 голосов
/ 07 августа 2020

Я реализовал свою аутентификацию Firebase JWT в Hasura, используя это руководство https://hasura.io/blog/authentication-and-authorization-using-hasura-and-firebase/. В моем приложении React Native большинство пользователей могут без проблем пройти аутентификацию.

Однако время от времени я получаю пользователя со следующей ошибкой:

{"type":"websocket-log","timestamp":"2020-08-06T20:19:51.115+0000","level":"info","detail":{"event":{"type":"operation","detail":{"request_id":null,"operation_id":"1","query":null,"operation_type":{"type":"completed"},"operation_name":"GetUsersByUid"}},"connection_info":{"websocket_id":"18c143a3-cd08-4e0e-a11e-022d44777b3c","token_expiry":null,"msg":null},"user_vars":null}}

{"type":"websocket-log","timestamp":"2020-08-05T16:35:12.145+0000","level":"error","detail":{"event":{"type":"operation","detail":{"request_id":null,"operation_id":"3147","query":null,"operation_type":{"type":"proto_err","detail":"cannot start as connection_init failed with : claims key: 'https://hasura.io/jwt/claims' not found"},"operation_name":"GetUsersByUid"}},"connection_info":{"websocket_id":"[WEBSTOCKET_ID]","token_expiry":null,"msg":null},"user_vars":null}}

Когда Я видел это, я подумал, что это может означать, что мне нужно обновить sh токен. Вот мой код в моем приложении React Native, который я взял прямо из приведенного выше руководства (https://hasura.io/blog/authentication-and-authorization-using-hasura-and-firebase/):

    const user = firebaseApp.auth().currentUser; 
    if (user) {
      const token = await user.getIdToken(); 
      const idTokenResult = await user.getIdTokenResult();
      const hasuraClaim = idTokenResult.claims["https://hasura.io/jwt/claims"];
      
      if (hasuraClaim) {
        setAuthState({ status: "in", user, token });
      } else {
        // Check if refresh is required.
        const metadataRef = firebase
          .database()
          .ref("metadata/" + user.uid + "/refreshTime");

        metadataRef.on("value", async (data) => {
          if(!data.exists) return
          // Force refresh to pick up the latest custom claims changes.
          const token = await user.getIdToken(true);
          setAuthState({ status: "in", user, token });
        });
      }
    } else {
      setAuthState({ status: "out" });
    }

Я избавился от условия hasuraClaim и попытался структурировать свои код такой, что я каждый раз проверял, требуется ли refre sh, и заставлял refre sh получать последние изменения пользовательских требований. Получилось следующее:

const user = firebaseApp.auth().currentUser; 
    if (user) {
      const token = await user.getIdToken(); 
      const idTokenResult = await user.getIdTokenResult();
      const hasuraClaim = idTokenResult.claims["https://hasura.io/jwt/claims"];
      
        // Check if refresh is required.
        const metadataRef = firebase
          .database()
          .ref("metadata/" + user.uid + "/refreshTime");

        metadataRef.on("value", async (data) => {
          if(!data.exists) return
          // Force refresh to pick up the latest custom claims changes.
          const token = await user.getIdToken(true);
          setAuthState({ status: "in", user, token });
        });
    } else {
      setAuthState({ status: "out" });
    }

Однако это также не работает для пользователя, у которого возникла проблема инициализации соединения.

Кто-нибудь знает, что я могу сделать, чтобы получить этот JWT Аутентификация Firebase будет работать в Hasura для всех пользователей? Или кто-нибудь знает, почему у некоторых пользователей это не работает (возможно, из-за истекших токенов), но почему у большинства пользователей это работает нормально?

К вашему сведению, я использую запросы Apollo для доступа к моей базе данных Hasura PostGres .

...