RTK Query авторизация sanctum + fortify

Я делаю авторизацию на laravel sanctum и fortify, а на клиенте использую react + redux toolkit. После успешного входа я через RTK query получаю данные авторизованного пользователя getUser

export const prepareAuthHeader = (headers: any, { getState, endpoint }: any) => {
    const CSRF_token = Cookies.get('XSRF-TOKEN');

    if (CSRF_token && endpoint !== 'refresh')
        headers.set('X-XSRF-TOKEN', CSRF_token);

    // For laravel API to disable redirects and enable JSON response
    headers.set('Accept', 'application/json');

    return headers;
}

export const authApi = createApi({
    reducerPath: 'auth/api',
    baseQuery: fetchBaseQuery({
        baseUrl: '/api/',
        prepareHeaders: prepareAuthHeader,
        credentials: 'include',
    }),
    tagTypes: ['User'],
    endpoints: (builder) => ({
        register: builder.mutation<{ user: any, token: string }, {
            name: string,
            email: string,
            password: string,
            password_confirmation: string,
        }>({
            query: (payload) => ({
                url: `register`,
                method: 'POST',
                body: payload
            }),
            invalidatesTags: ["User"],
        }),
        login: builder.mutation<{ user: any, token: string }, {
            email: string,
            password: string,
        }>({
            query: (payload) => ({
                url: `login`,
                method: 'POST',
                body: payload,
            }),
            invalidatesTags: ["User"],
        }),
        logout: builder.mutation<void, void>({
            query: () => ({
                url: `logout`,
                method: 'POST',
            }),
            invalidatesTags: ["User"],
        }),
        getUser: builder.query<IUser, void>({
            query: () => ({
                url: `user`,
                credentials: "include",
            }),
            providesTags: ["User"],
            async onQueryStarted(id, {dispatch, queryFulfilled}) {
                // Put user in slice store
                const {data} = await queryFulfilled;
                dispatch(setUser(data))
            }
        }),
    })
});

А в index.tsx у меня следующий код, который сразу при загрузке забирает авторизованного пользователя, если он есть

/**
 * Load user data
 */
const loadUser = () => {
    store.dispatch(authApi.endpoints.getUser.initiate());
}

// Get CSRF token for API and first load user data
if(!Cookies.get('XSRF-TOKEN'))
    fetch('/sanctum/csrf-cookie', {
        headers: {
            'Accept': 'application/json'
        },
        credentials: 'include'
    }).then(response => loadUser());
else loadUser();

//
// Mount react

Вопрос в следующем. Где правильнее хранить авторизованного user? Сейчас я после его загрузки отправляю юзера в auth.slice.ts. То есть, что бы получить ползователя где-то в коде: const user = useTSelector(state => state.auth.user);.

Но можно же просто написать const {data: user} = useGetUserQuery(). Так короче)

У кого был опыт такой авторизации, можете рассказать о плюсах и минусах обоих способов? Есть ли вообще разница. Да, знаю, что вопрос, скорее субъективный, но всё же. Как в случае второго способа удалить пользователя при logout'е?


Ответы (0 шт):