В моем приложении React/nextJS я проверяю действительный токен в статической функции getInitialProps
. Я использую это как HOC - но это не должно иметь значения в этом случае.
Если токен недействителен (или отсутствует), пользователь перенаправляется на страницу входа. Это делается с помощью функции redirect
как показано ниже. Все идет нормально.
Как я могу передать URL страницы, с которой пользователь перенаправляется в компонент входа?
Если пользователь не вошел в систему и вызывает что-то вроде http://my-server.com/any-page, он перенаправляется на страницу индекса (http://my-server.com): будет вход в систему форма. Если вход выполнен успешно, я бы хотел перенаправить его обратно на первую вызванную страницу: http://my-server.com/any-page
- Вызовите страницу с ограниченным доступом как не авторизованный пользователь
- Перенаправить на главную страницу входа
- После авторизации перенаправить обратно на страницу 1.
Я понятия не имею, как передать эту информацию в функцию входа в систему...
с-сервера-props.js
export default WrappedComponent =>
class extends Component {
static async getInitialProps (context) {
const { req, pathname } = context
let isValid = false
if (req && req.headers) {
const cookies = req.headers.cookie
if (typeof cookies === 'string') {
const cookiesJSON = jsHttpCookie.parse(cookies)
initProps.token = cookiesJSON['auth-token']
if (cookiesJSON['auth-token']) {
jwt.verify(cookiesJSON['auth-token'], secret, (error, decoded) => {
if (error) {
console.error(error)
} else {
isValid = true
}
})
}
}
}
// Redirect to index (=login) page if isValid is false
if (!isValid && pathname && pathname !== '/') {
redirect(context, pathname ? '/?ref=' + pathname : '/')
}
return initProps
}
render () {
return <WrappedComponent {...this.props} />
}
}
redirect.js
import Router from 'next/router'
export default (context, target) => {
if (context.res) {
// server
context.res.writeHead(303, { Location: target })
context.res.end()
} else {
// In the browser, we just pretend like this never even happened ;)
Router.replace(target)
}
}
страниц/index.js
В index.js есть функция submit
для входа в систему пользователя. Там пользователь должен быть перенаправлен на начальную страницу:
_onSubmit (event) {
this.props.loginMutation({
variables: { username, password }
}).then(response => {
const token = response.data.token
if (token) {
Cookies.set('auth-token', token, { expires: 1 })
this.props.client.resetStore().then(() => {
window.location.assign('/') // <-- Redirect to initial called page
})
}
})
}