Meteor, React Router 4 и аутентификация
Я прочесывал inet, пытаясь найти что-нибудь, что определяет, как обрабатывать аутентификацию в meteor и react router 4.
В принципе, я хочу, чтобы определенные маршруты были доступны только аутентифицированным пользователям. Есть ли на него какая-нибудь документация?
Асил
1 ответ:
Meteor имеет очень хорошо развитую систему учетных записей пользователей. Он предоставляет готовые библиотеки для аутентификации OAuth с помощью Twitter, Facebook и т. д. а также базовые, но полезные пакеты пользовательского интерфейса. Сначала проверьте официальное руководство Meteor здесь.
Для реализации маршрутизации необходимо отслеживать
Meteor.userId()
и изменять маршрут через реактивную систему Метеора, называемую Tracker.Meteor.userId()
возвращает идентификатор пользователя, если текущий подключенный пользователь вошел в систему, и null в противном случае. Я привожу пример кода, где React Маршрутизатор используется для маршрутизации, ниже. Обратите внимание, что вам также понадобитсяhistory
пакет , устанавливаемый и импортируемый при работе с React Router v4.В вашем клиенте / main.js;
import { Meteor } from 'meteor/meteor'; import React from 'react'; import ReactDOM from 'react-dom'; import { Tracker } from 'meteor/tracker' import {onAuthChange, routes} from "../imports/routes/routes"; Tracker.autorun(function(){ const authenticated = !! Meteor.userId(); onAuthChange(authenticated); }); Meteor.startup(() => { ReactDOM.render(routes, document.getElementById('app')); });
И в ваших маршрутах.файл js;
import { Meteor } from 'meteor/meteor'; import React from 'react'; import { Router, Route, Switch } from 'react-router-dom'; import createBrowserHistory from 'history/createBrowserHistory' import Home from './../ui/components/Home'; import Login from './../ui/components/Login'; import NotFound from './../ui/components/NotFound'; import Signup from './../ui/components/Signup'; const history = createBrowserHistory(); const unauthenticatedPages = ['/', '/signup']; const authenticatedPages = ['/link']; const publicPage = function () { if (Meteor.userId()) { history.replace('/link'); } }; const privatePage = function () { if(! Meteor.userId()) { history.replace('/'); } }; export const routes = ( <Router history = {history}> <Switch> <Route exact path='/:id' component= {Login} onEnter={publicPage}/> <Route exact path='/signup' component={Signup} onEnter={publicPage}/> <Route exact path='/link' render={ () => <Home greet='User'/> } onEnter={privatePage} /> <Route component={NotFound}/> </Switch> </Router> ); export const onAuthChange = function (authenticated) { console.log("isAuthenticated: ", authenticated); const path = history.location.pathname; const isUnauthenticatedPage = unauthenticatedPages.includes(path); const isAuthenticatedPage = authenticatedPages.includes(path); if (authenticated && isUnauthenticatedPage) { // pages: /signup and / console.log(`Authenticated user routed to the path /link`); history.replace('/link'); } else if (!authenticated && isAuthenticatedPage) { console.log(`Unauthenticated user routed to the path /`); history.replace('/'); } };