Защищенные маршруты и аутентификация с помощью React и Node.js
https://medium.com/strapi/protected-routes-and-authentication-with-react...
Защищенные маршруты и аутентификация с помощью React и Node.js
этом руководстве мы быстро реализуем базовый поток аутентификации с использованием веб-токенов JSON , которые Strapi , а также (что может быть более интересным) как использовать поставщиков аутентификации (Facebook, GitHub, Google…) со Strapi для аутентификации ваших пользователей .
Примечание: исходный код этой статьи доступен на GitHub .
Создание проекта
Прежде всего, вам нужно создать Strapi API:
npm install strapi@alpha -g
strapi new my-app
cd my-app && strapi start
npm install create-react-app -g
create-react-app good-old-react-authentication-flow
Вам нужно зарегистрировать своего первого пользователя , и тогда вы готовы к работе!
Интерфейсная архитектура приложения
Я большой поклонник архитектуры React Boilerplate , поэтому я создал что-то похожее для организации своего кода:
/src
└─── containers // React components associated with a Route
| └─── App // The entry point of the application
| └─── AuthPage // Component handling all the auth views
| └─── ConnectPage // Handles the auth with a custom provider
| └─── HomePage // Can be accessed only if the user is logged in
| └─── NotFoundPage // 404 Component
| └─── PrivateRoute // HoC
|
└─── components // Dummy components
|
└─── utils
└─── auth
└─── request // Request helper using fetch
Настройка роутера и PrivateRoute
Чтобы реализовать представления аутентификации, нам сначала нужно создать HoC : компонент высшего порядка , который будет проверять, может ли пользователь получить доступ к определенному URL-адресу.
Для этого нам просто нужно следовать официальной документации и изменить fakeAuth
пример и используйте наш auth.js
помощник:
import React from 'react';
import { Redirect, Route } from 'react-router-dom';
// Utils
import auth from '../../utils/auth';
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
auth.getToken() !== null ? (
<Component {...props} />
) : (
<Redirect to={{
pathname: 'auth/login',
state: { from: props.location }
}}
/>
):
)} />
);
Создадим маршрутизацию:
import React, { Component } from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
// Components
import AuthPage from '../../containers/AuthPage';
import ConnectPage from '../../containers/ConnectPage';
import HomePage from '../../containers/HomePage';
import NotFoundPage from '../../containers/NotFoundPage';
// This component ios HoC that prevents the user from accessing a route if he's not logged in
import PrivateRoute from '../../containers/PrivateRoute';
// Design
import './styles.css';
class App extends Component {
render() {
return (
<Router>
<div className="App">
<Switch>
{/* A user can't go to the HomePage if is not authenticated */}
<PrivateRoute path="/" component={HomePage} exact />
<Route path="/auth/:authType/:id?" component={AuthPage} />
<Route exact path="/connect/:provider" component={ConnectPage} />
<Route path="" component={NotFoundPage} />
</Switch>
</div>
</Router>
);
}
}
export default App;
Создание представлений аутентификации
Теперь, когда все наши маршруты реализованы, нам нужно создать наши представления.
То, как мы объявили наши маршруты, позволяет нам иметь один компонент, отвечающий за создание правильной формы в соответствии с location
.
Прежде всего, давайте создадим forms.json
файл, который будет обрабатывать создание формы в каждом представлении авторизации:
- Забыли пароль
- авторизоваться
- регистр
- Сброс пароля
Эта структура JSON
будет выглядеть следующим образом ( вы можете увидеть customBootstrapClass
ключ, который нужен в Input
компонент ):
{
"views": {
"login": [
{
"customBootstrapClass": "col-md-12",
"label": "Username",
"name": "identifier",
"type": "text",
"placeholder": "johndoe@gmail.com"
},
{
"customBootstrapClass": "col-md-12",
"label": "Password",
"name": "password",
"type": "password"
},
{
"customBootstrapClass": "col-md-6",
"label": "Remember me",
"name": "rememberMe",
"type": "checkbox"
}
]
},
"data": {
"login": {
"identifier": "",
"password": "",
"rememberMe": false
}
}
}
Настройка состояния при изменении местоположения
Чтобы установить форму, когда пользователь переходит из auth/login
к auth/register
нам нужно использовать следующие жизненные циклы:
componentDidMount() { // Generate the form with a function to avoid code duplication // in other lifecycles this.generateForm(this.props); }componentWillReceiveProps(nextProps) { // Since we use the same container for all the auth views we need to update // the UI on location change if (nextProps.location.match.params.authType !== this.props.location.match.params.authType) { this.generateForm(nextProps); } }
В generateForm
Метод отвечает за получение данных из forms.json
файл выше.
Создание представления
Чтобы создать форму, нам просто нужно сопоставить извлеченные данные в forms.json
файл.
handleChange = ({ target }) => this.setState({ value: { ...this.state.value, [target.name]: target.value } });
render() {
const inputs = get(forms, ['views', this.props.match.params.authType, []);
return (
<div>
<form onSubmit={this.handleSubmit}>
{inputs.map((input, key) => (
<Input
autoFocus={key === 0}
key={input.name}
name={input.name}
onChange={this.handleChange}
type={input.type}
value={get(this.state.value, [input.name], '')}
/>
))}
<Button type="submit" />
</form>
</div>
);
}
Что ж, на этом этапе должны быть созданы все представления, необходимые для аутентификации ваших пользователей! Нам просто нужно сделать вызов API для доступа к приложению.
Отправка данных в API
Чтобы сделать вызов API, у меня есть request
помощник ( который вы можете получить в демонстрационном приложении ), поэтому нам просто нужно использовать его в нашем handleSubmit
функция:
handleSubmit = (e) => {
e.preventDefault();
const body = this.state.value;
const requestURL = 'http://localhost:1337/auth/local';
request(requestURL, { method: 'POST', body: this.state.value})
.then((response) => {
auth.setToken(response.jwt, body.rememberMe);
auth.setUserInfo(response.user, body.rememberMe);
this.redirectUser();
}).catch((err) => {
console.log(err);
});
}
redirectUser = () => {
this.props.history.push('/');
}
Здесь нет ничего особенного, как только мы получим ответ от API, мы просто сохраним необходимую информацию либо в localStorage
или sessionStorage
и мы перенаправляем пользователя на домашнюю страницу.
Что ж, мы только что выполнили самую сложную часть, потому что использовать собственный провайдер, такой как Facebook, очень просто!
http://uc.org.ru/node/218 # продолжение ...
Обратная связь
Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях
пишите мне на netdm@mail.ru
Добавить комментарий