#passport.js #gatsby
#passport.js #gatsby
Вопрос:
я использую Passport-local для аутентификации и Gatsby на интерфейсе
Как правило, код работает нормально. Когда я нажимаю на выход из системы, сервер возвращает вызов 200, и я получаю ответ «Пользователь успешно вышел из системы». Затем я перешел на страницу входа. Оттуда я не могу получить доступ к своей странице публикации, которая является частным маршрутом. Моя страница входа и публикации — это маршруты на стороне клиента
Проблема возникает, когда я нажимаю на домашнюю страницу (которая является статической страницей). Оттуда, когда я нажимаю на ссылку post, я перехожу на страницу post, которая предположительно недоступна теперь, когда я вышел из системы. Мой создатель действий fetchuser запускается и может получать данные пользователя, даже если я уже вышел из своего приложения
Кто-нибудь знает, как решить эту проблему? Заранее спасибо
СЕРВЕР
api выхода из системы
router.get("/signout", (req, res) => {
req.logout();
res.send("Sign Out Successfully");
});
я api
router.get("/me", (req, res) => {
res.send(req.user);
});
КЛИЕНТ
приложение
const App = () => {
useEffect(() => {
store.dispatch(fetchUser())
}, [])
return (
<Layout>
<Alert />
<Router basepath="/app">
<Signin path="/signin" />
<Signup path="/signup" />
<PrivateRoute path="/post" component={Post} />
{/* <Default path="/" /> */}
</Router>
</Layout>
)
}
export default App
Создатель действия fetchUser
export const fetchUser = () => async dispatch => {
try {
const res = await axios.get("http://localhost:5000/api/users/me", {
withCredentials: true,
})
dispatch({
type: FETCH_USER,
payload: res.data,
})
} catch (err) {
console.log(err)
dispatch({
type: AUTH_ERROR,
})
}
}
создатель действия для выхода из системы
export const signOut = () => async dispatch => {
const res = await axios.get("http://localhost:5000/api/users/signout")
console.log(res)
dispatch({
type: SIGNOUT,
})
navigate("/app/signin")
}
Комментарии:
1. Почему вы не используете файлы cookie для контроля состояния пользователя и избежания этой проблемы?
2. Я больше знаком с токеном и играю с файлами cookie. Поскольку моя домашняя страница — SSR, в то время как мои страницы входа и публикации отображаются на стороне клиента, я не уверен, что это проблема
3. Я думаю, что оптимально обрабатывать авторизацию пользователя с помощью файлов cookie (плюс токены) или
localStorage
, мой обходной путь будет сосредоточен на этом. Если вы решили воспользоваться этим обходным путем, я могу дать ответ.4. Конечно. Если у вас есть справочные коды для этого, я ценю и посмотрю. Я планирую создать его с использованием токена для сравнения различных механизмов аутентификации
Ответ №1:
Я думаю, что ваш подход правильный и действительный, несмотря на то, что лично считаю, что обработка его с помощью файлов cookie или localStorage
может быть легко поддержана.
Ваш <PrivateRoute>
компонент должен обрабатывать вашу логику и выполнять некоторые действия в зависимости от состояния пользователя (зарегистрирован или нет), что-то вроде:
import React from "react"
import { navigate } from "gatsby"
import { isLoggedIn } from "../services/auth"
const PrivateRoute = ({ component: Component, location, ...rest }) => {
if (!isLoggedIn() amp;amp; location.pathname !== `/app/login`) {
navigate("/app/login") // or your desireed page
return null
}
return <Component {...rest} />
}
export default PrivateRoute
Ваша auth
служба должна обрабатывать ваши запросы, в данном случае используя localStorage
, но ее можно заменить для ваших запросов API:
export const isBrowser = () => typeof window !== "undefined"
export const getUser = () =>
isBrowser() amp;amp; window.localStorage.getItem("gatsbyUser")
? JSON.parse(window.localStorage.getItem("gatsbyUser"))
: {}
const setUser = user =>
window.localStorage.setItem("gatsbyUser", JSON.stringify(user))
export const handleLogin = ({ username, password }) => {
if (username === `john` amp;amp; password === `pass`) {
return setUser({
username: `john`,
name: `Johnny`,
email: `johnny@example.org`,
})
}
return false
}
export const isLoggedIn = () => {
const user = getUser()
return !!user.username
}
export const logout = callback => {
setUser({})
callback()
}