Я создал рабочий процесс аутентификации для проекта с использованием внешнего интерфейса 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 (которое, как вы можете догадаться, я не писал)
Пожалуйста, помогите мне лучше понять этот рабочий процесс и как я мог Улучши это. Он постарался сделать все возможное, чтобы сделать этот вопрос слишком широким, но если я смогу еще больше сузить его, не стесняйтесь предлагать правку.