Как я должен обрабатывать истечение срока действия файлов cookie и рабочий процесс? - PullRequest
0 голосов
/ 15 февраля 2020

Я создал рабочий процесс аутентификации для проекта с использованием внешнего интерфейса Nuxt (универсальный режим) и конечной точки Apollo в качестве бэкэнда.

Это сочетание нескольких примеров, которые я нашел, и, с SSR, и так как я не полностью предвидеть, что может go не так, я хотел убедиться, что нет красного флажка о том, как я продолжаю.

На бэкэнде я использую промежуточное ПО express для подписи токенов аутентификации JWT, проверьте и вернуть их в заголовок авторизации. Вот промежуточное ПО:

import jwt from 'jsonwebtoken';
import { AuthenticationError } from 'apollo-server-express';

export const getToken = payload => {
    return jwt.sign(payload, process.env.SEED, { expiresIn: process.env.EXPTOKEN });
}
export const checkToken = (req, res, next) => {
    const rawToken = req.headers["authorization"]
    if (rawToken) {
        try {
            const token = rawToken.substring(7)
            // Verify that the token is validated
            const { user, role } = jwt.verify(token, process.env.SEED);

            const newToken = getToken({ user, role });

            req.user = user;
            req.role = role;
            res.header("Access-Control-Allow-Origin", "*");
            res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            res.set("Access-Control-Expose-Headers", "authorization");
            res.set("authorization", newToken);

        } catch (error) {
            if (error.name === "TokenExpiredError") {
                res.set("Access-Control-Expose-Headers", "authorization");
                res.set("authorization", false);
            }
            console.log("invalid token", error);
            return new AuthenticationError
            // Invalid Token
        }
    }

    next();
}

Поскольку существует модуль Nuxt-Apollo , я использовал его методы onLogin, onLogout и getToken для хранения строки JWT в повар ie. Насколько я понимаю, приложения SSR не имеют серверного локального хранилища, соответствующего клиенту, поэтому им приходится использовать куки. Правильно?

Вот мое промежуточное ПО nuxt, где я проверяю учетные данные пользователей, прежде чем разрешить им посещать маршрут авторизации. Это довольно грязно, но это делает работу, за исключением комментируемой части.

export default function ({ app, route, error, redirect }) {
  const hasToken = !!app.$apolloHelpers.getToken()

  // this part does not work
  /*   const tokenExpireDateTime = app.$cookies.nodeCookie.parse('cookie-name', 'expires')
    if (hasToken && tokenExpireDateTime < 0) {
      error({ statusCode: 403, message: 'Permission denied', description: 'Sorry, you are forbidden from accessing this page.' })
      app.$apolloHelpers.onLogout()
      return redirect('/login')
    }
   */
  if (!hasToken) {
    if (route.name === 'welcome-key') {
      // enrollment link route
    } else {
      if (route.name === 'home') {
        error({ errorCode: 403, message: 'You are not allowed to see this' })

        return redirect('/showcase')
      }
      if (!['login', 'forgot_password', 'reset_password-key'].includes(route.name)) {
        error({ errorCode: 403, message: 'You are not allowed to see this' })

        return redirect('/login')
      }
    }
  } else {
    if (['login', 'forgot_password', 'reset_password-key'].includes(route.name)) {

      redirect('/')
    }
  }
}

У меня есть одна проблема и несколько путаницы.

Моя проблема в том, что я не могу получите значение cook ie expires для перенаправления в вышеупомянутом промежуточном программном обеспечении nuxt, если необходимо снова войти в систему из-за истечения срока действия JWT. Я использовал фрагмент кода, упомянутый в этом выпуске в качестве ссылки.

В связи с этим вопросом у меня возникает путаница:

  • Дата истечения срока действия Я полагаю, что параметр cook ie устанавливается модулем Nuxt-Apollo, и я должен сделать так, чтобы он соответствовал длительности, установленной на сервере (т. е. process.env.EXPTOKEN в промежуточном программном обеспечении сервера, упомянутом выше), верно?

  • Это время истечения может быть легко изменено, и реальная безопасность заключается в отсутствии действительного токена в заголовках, когда запрос обрабатывается промежуточным ПО моего сервера. Он используется для обнаружения и перенаправления на стороне клиента токена / Cook с истекшим сроком действия ie, а также для предварительной выборки данных, относящихся к серверу, во время SSR. Правильно?

  • Новый токен, испускаемый моим промежуточным программным обеспечением express, не учитывается в моем интерфейсе: он не обновляет ie сохраненный JWT и значение expires сторона клиента. Я имею в виду, что я вижу, как в ответе обновляется строка JWT заголовка авторизации, но cook ie - нет. В следующем запросе все еще используется первая строка JWT. Должен ли я обновлять его при каждой поездке туда и обратно? Чего мне не хватает в подходе промежуточного программного обеспечения express (которое, как вы можете догадаться, я не писал)

Пожалуйста, помогите мне лучше понять этот рабочий процесс и как я мог Улучши это. Он постарался сделать все возможное, чтобы сделать этот вопрос слишком широким, но если я смогу еще больше сузить его, не стесняйтесь предлагать правку.

...