На моем сервере моя реализация GraphQL использует Flask, Graphene и SQLAlchemy. В идеале я хотел бы иметь возможность просто манипулировать заголовками и возвращать ответ об ошибке 401, но GraphQL возвращает все как 200.
Используя flask.abort (401), я, по крайней мере, могу получить этот ответ:
...
"errors": [
{
"message": "401 Unauthorized: The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.",
"locations": [
{
"line": 11,
"column": 3
}
]
}
]
...
Я вижу в этом компромисс, над которым я могу работать на данный момент. Тем не мение; потому что ничто не может быть настолько простым ... Я не уверен, как я могу получить это сообщение об ошибке. Я читал, что может быть проблема с самим QueryRenderer
, который проглатывает эти ошибки GraphQL, но мне удается перехватить их в объекте Network
в _4 _..., который, по сути, выглядит примерно так.
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: {…}}
__proto__: Promise[
[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object
data: {viewer: {…}}
errors: Array(4)
0: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
1: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
2: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
3: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
length: 4
__proto__: Array(0)
__proto__:Object
Я действительно не думаю, что обработка этой ошибки на сетевом уровне моей среды была бы правильным способом справиться с этим. Кажется, что QueryRenderer имеет наибольший смысл ... Я установил его, по сути, как единственный источник истины.
Кстати, я использую Relay Modern, если это не было очевидно. Так что, скорее всего, никакие решения, основанные на Relay Classic, не будут применяться.
Изменить: сообщение об ошибке в сторону, моей мотивацией для этого была правильная обработка токенов JWT. Я думаю, что решение, которое я ищу, связано не с обработкой этих ответов об ошибках, а скорее с расширением моего понимания JWT.
Я не понимал, что мой клиент легко сможет декодировать JWT с помощью такого пакета, как jwt-decode
, который затем дает мне доступ к информации об истечении срока действия ... что в конечном итоге, как я предвижу, приведет меня к некоторой форме реализации промежуточного программного обеспечения, которое оценило бы количество времени, оставшееся на JWT, и необходимость обновления.