Не удается прочитать свойство 'code' из undefined, не удалось расшифровать маркер Firebase ID - PullRequest
1 голос
/ 12 февраля 2020

Я периодически получаю эту ошибку примерно в 5% запросов, и я не уверен, почему. Кажется, он работает большую часть времени, но я бы хотел довести его до 100%.

{"name":"myapp","hostname":"worker-844ddfbc9f-ntlmz","pid":18,"level":50,
"err":"[Throws: Cannot read property 'code' of undefined]",
"msg":"Context creation failed: Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.",
"time":"2020-02-12T02:16:33.538Z","v":0}
TypeError: Cannot read property 'code' of undefined
    at FirebaseAuthError.get [as code] (/app/node_modules/firebase-admin/lib/utils/error.js:51:35)
    at FirebaseAuthError.FirebaseError.toJSON (/app/node_modules/firebase-admin/lib/utils/error.js:67:24)
    at JSON.stringify (<anonymous>)
    at prettyJSONStringify (/app/node_modules/apollo-server-core/dist/runHttpQuery.js:257:17)
    at throwHttpGraphQLError (/app/node_modules/apollo-server-core/dist/runHttpQuery.js:26:42)
    at Object.<anonymous> (/app/node_modules/apollo-server-core/dist/runHttpQuery.js:66:28)
    at Generator.next (<anonymous>)
    at fulfilled (/app/node_modules/apollo-server-core/dist/runHttpQuery.js:4:58)
    at process._tickCallback (internal/process/next_tick.js:68:7)

клиент

const authLink = setContext(async (_, { headers }) => {
    let token;
    if (firebase.auth().currentUser) {
        token = await firebase.auth().currentUser.getIdToken();
    }
    return {
        headers: {
            ...headers,
            authorization: `Bearer ${token}`,
        },
    };
});

сервер

            let token = req.headers.authorization;

            if (!token || !token.length) {
                console.log('no token');
            }

            token = token.split('Bearer ')[1];

            // validate JWT and pluck user id
            const { uid } = await firebase.auth().verifyIdToken(token);

            // find the user based on id
            const user = await firebase.auth().getUser(uid);

1 Ответ

2 голосов
/ 22 февраля 2020

Ваш код клиента приведет к заголовку авторизации Bearer undefined, если firebase.auth().currentUser неверно. Этот заголовок авторизации не приведет к регистрации no token в коде сервера (его длина равна 16). При запуске firebase.auth().verifyIdToken('undefined').

серверный код не будет работать. Вам необходимо либо запретить клиенту отправлять запрос, если firebase.auth().currentUser неверно, либо перехватить неопределенный токен в коде сервера.

Примечание: использование неопределенной переменной в строке шаблона приводит к строке «неопределенная» (не пустая строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...