Я реализовал свою аутентификацию 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 .