В приложениях на Inferno, как и в других современных фронтенд-фреймворках, аутентификация и авторизация играют ключевую роль в обеспечении безопасности и управлении доступом. Аутентификация отвечает за проверку личности пользователя, а авторизация — за определение прав доступа к ресурсам приложения.
Для реализации аутентификации необходимо хранить состояние пользователя в приложении. Обычно для этого используют контекст (Context API) или глобальные состояния через сторонние менеджеры состояния, такие как Redux или MobX.
Пример создания контекста пользователя:
import { createContext } from 'inferno';
export const AuthContext = createContext(null);
Для предоставления состояния пользователю:
import { Component } from 'inferno';
import { AuthContext } from './AuthContext';
class AuthProvider extends Component {
constructor(props) {
super(props);
this.state = {
user: null,
login: this.login,
logout: this.logout,
};
}
login = (userData) => {
this.setState({ user: userData });
};
logout = () => {
this.setState({ user: null });
};
render() {
return (
<AuthContext.Provider value={this.state}>
{this.props.children}
</AuthContext.Provider>
);
}
}
export default AuthProvider;
Аутентификация обычно выполняется через API, возвращающее токен или
сессионные данные. В Inferno компоненты могут взаимодействовать с
сервером с помощью fetch или Axios.
Пример функции логина:
export async function authenticate(email, password) {
const response = await fetch('https://api.example.com/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
});
if (!response.ok) {
throw new Error('Ошибка аутентификации');
}
const data = await response.json();
localStorage.setItem('authToken', data.token);
return data.user;
}
После успешного логина состояние пользователя обновляется через
AuthContext.
Для управления доступом к различным страницам приложения используются
защищенные маршруты. В Inferno с маршрутизацией на
основе inferno-router это реализуется через
компонент-обертку.
Пример защищенного маршрута:
import { Route, Redirect } from 'inferno-router';
import { useContext } from 'inferno';
import { AuthContext } from './AuthContext';
function PrivateRoute({ component: Component, ...rest }) {
const { user } = useContext(AuthContext);
return (
<Route
{...rest}
render={(props) =>
user ? <Component {...props} /> : <Redirect to="/login" />
}
/>
);
}
Токены доступа часто хранятся в localStorage или
sessionStorage. Для безопасности рекомендуется хранить
токены в HttpOnly cookies, если сервер поддерживает
такой метод. При каждом запросе к API необходимо включать токен в
заголовки:
const token = localStorage.getItem('authToken');
fetch('https://api.example.com/protected', {
headers: {
Authorization: `Bearer ${token}`,
},
});
Для длительных сессий необходимо предусмотреть refresh token и автоматический выход пользователя при истечении срока действия токена. Это можно реализовать через перехватчики запросов:
async function fetchWithAuth(url, options = {}) {
const token = localStorage.getItem('authToken');
const response = await fetch(url, {
...options,
headers: {
...options.headers,
Authorization: `Bearer ${token}`,
},
});
if (response.status === 401) {
localStorage.removeItem('authToken');
window.location.href = '/login';
}
return response;
}
Авторизация на клиенте подразумевает проверку ролей или прав пользователя перед отображением компонентов. Это может быть реализовано через условный рендеринг:
function AdminPanel() {
const { user } = useContext(AuthContext);
if (!user || user.role !== 'admin') {
return <p>Доступ запрещен</p>;
}
return <div>Административная панель</div>;
}
Эти подходы позволяют построить в Inferno приложения с надежной системой аутентификации и авторизации, минимизируя риски несанкционированного доступа и обеспечивая корректное управление пользователями.