В этом уроке мы рассмотрим, как интегрировать проверку подлинности Okta в наше приложение React. Наша главная цель — реализовать аутентификацию Okta как во внешнем интерфейсе (React), так и во внутреннем интерфейсе (FastAPI). В этом руководстве основное внимание будет уделено приложению React.

Прежде чем продолжить, важно отметить, что у нас есть предварительное руководство, в котором объясняется, как создать домен Okta и идентификатор клиента, которые мы будем использовать в нашем приложении React. Для начала ознакомьтесь с этим руководством: Аутентификация Okta (Настройка Okta)

Установка зависимостей Okta:

В вашем приложении React вам необходимо установить две зависимости Okta: @okta/okta-auth-js и @okta/okta-react. Вы можете установить их с помощью npm или пряжи.

Создание файла конфигурации Okta:

Затем создайте файл с именем config.js в корневой папке вашего приложения React. В этом файле будет храниться конфигурация вашего домена Okta и идентификатора клиента. Вот пример того, как должен выглядеть файл config.js:

const OKTA_ISSUER = "https://<YOUR_OKTA_DOMAIN>/oauth2/default";
const OKTA_CLIENT_ID = "<YOUR_OKTA_CLIENT_ID>";
const OKTA_SCOPES = "openid profile email";
const scopes = OKTA_SCOPES as string;
const scopesArray = scopes && scopes.split(/\s+/);
export const oktaConfig = {
    issuer: OKTA_ISSUER as string, 
    clientId: OKTA_CLIENT_ID as string,
    redirectUri: `${window.location.origin}/login/callback`,
    scopes: scopesArray || [],
    pkce: true,
    disableHttpsCheck: true
};

Безопасность ваших маршрутов

Переходя к следующему шагу, мы обеспечим безопасность наших маршрутов. Мы определим, какие маршруты требуют аутентификации, а какие общедоступны.

Чтобы защитить ваши маршруты, убедитесь, что ваша версия React-router-dom равна 5 или ниже. В этом уроке мы используем версию 5.3.0. Обновите файлы маршрутов, как показано во фрагменте кода.

import React, { Component } from "react";
import {
    Route,
    BrowserRouter,
    useHistory,
    Switch,
    withRouter,
} from "react-router-dom";
import { OktaAuth, toRelativeUrl } from "@okta/okta-auth-js";
import { Security, SecureRoute, LoginCallback } from "@okta/okta-react";
import { oktaConfig } from "../config";
import IndexPage from "../public/Index";
import SecretPage1 from "../private/SecretPage1";
import SecretPage2 from "../private/SecretPage2";
// Other Import statements here...
const oktaAuth = new OktaAuth(oktaConfig);
const Routes: React.FC = () => {
    const history = useHistory();
    const restoreOriginalUri = (_oktaAuth: OktaAuth, originalUri?: string) => {
        history.replace(
            toRelativeUrl(originalUri || "/", window.location.origin)
        );
    };
    return (
        <Security oktaAuth={oktaAuth} restoreOriginalUri={restoreOriginalUri}>
            <Switch>
                {/* Public routes */}
                <Route
                    path="/login/callback"
                    exact={true}
                    component={LoginCallback}
                />
                <Route exact path="/" component={IndexPage} />
                <SecureRoute exact path="/page1" component={SecretPage1} />
                <SecureRoute
                    exact
                    path="/page2"
                    component={SecretPage2}
                />
            </Switch>
        </Security>
    );
};
const AppWithRouterAccess = withRouter(Routes);
class AppRoutes extends Component {
    render() {
        return (
            <BrowserRouter>
                <AppWithRouterAccess />
            </BrowserRouter>
        );
    }
}
export default AppRoutes;

В приведенном выше коде вы можете видеть, что маршруты «index» и «login/callback» являются общедоступными, поскольку мы используем компонент «Route» из response-router-dom. Между тем, «SecretPage1» и «SecretPage2» являются частными маршрутами, поскольку они используют компонент «SecureRoute» из «@okta/okta-react». Дополнительно имеется обертка для компонента «Безопасность».

Проверка корневого файла

Теперь наш основной файл приложения будет выглядеть следующим образом:

import React from "react";
import AppRoutes from "./routes";
const App: React.FC = () => {
    return (
        <>
            <React.StrictMode>
                <AppRoutes />
            </React.StrictMode>
        </>
    );
};
export default App;

О входе и выходе

Наконец, нам нужны кнопки входа и выхода, чтобы подключиться или перенаправить нас на нашу целевую страницу или страницу входа. В моем случае компонент заголовка будет выглядеть следующим образом:

import { useOktaAuth } from "@okta/okta-react";
function Header() {
    const { oktaAuth, authState } = useOktaAuth();
    const logout = () => void oktaAuth.signOut();
    const login = () => void oktaAuth.signInWithRedirect({ originalUri: "/" });
    return (
        <>
            {authState?.isAuthenticated ? (
                <button 
                    onClick={() => void logout()}
                    className="header-auth-btn logoutLogo"
                >
                    Log out
                </button>
            ) : (
                <button
                    onClick={() => void login()}
                    className="header-auth-btn logoutLogo"
                >
                    Log-In
                </button>
            )}
        </>
    );
}
export default Header;

Бонусный раздел

В качестве бонуса для условной визуализации компонентов на основе аутентификации вы можете использовать следующий фрагмент кода:

import { useOktaAuth } from "@okta/okta-react";
import useAuthUser from "../../hooks/getUser";
const { authState } = useOktaAuth();
const userInfo = useAuthUser();

Переменная «authState» предоставляет информацию об аутентификации, токенах доступа и токенах обновления, а «userInfo» помогает получить данные пользователя, такие как имя, фамилия и адрес электронной почты, предоставленные приложению Okta.

Похожие руководства

Включение Okta-аутентификации (Настройка Okta Dashboard)
Настройка Okta-аутентификации в FastAPI (Backend)

Методические рекомендации

Нам необходимо создать раздел, подчеркивающий важность сопоставления домена Okta, идентификатора клиента Okta и URI перенаправления в файле конфигурации с соответствующими значениями на панели разработчика Okta. С другой стороны, следует также подчеркнуть необходимость изменения маршрута /login/callback в конфигурации маршрутов.

Заключение

В этом руководстве мы продемонстрировали, как интегрировать проверку подлинности Okta в ваше приложение React с помощью Vitejs. Мы рассмотрели установку зависимостей Okta, создание файла конфигурации Okta и защиту ваших маршрутов для аутентификации. Вы также можете добавить кнопки входа и выхода для улучшения взаимодействия с пользователем.

Кроме того, мы предоставили дополнительный раздел, посвященный отрисовке условных компонентов на основе статуса аутентификации и получения информации о пользователе. Обладая этими знаниями, вы можете реализовать надежные функции аутентификации и авторизации в своем приложении React.