From fb0deab271f33723e892bd24550c9b24eb62dbf9 Mon Sep 17 00:00:00 2001 From: maxim Date: Wed, 19 Mar 2025 21:42:09 +0300 Subject: [PATCH] update `authProvider` for `custom` auth --- src/authProvider.ts | 130 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 104 insertions(+), 26 deletions(-) diff --git a/src/authProvider.ts b/src/authProvider.ts index d6e3cfa..195f5d5 100644 --- a/src/authProvider.ts +++ b/src/authProvider.ts @@ -1,27 +1,61 @@ import type {AuthProvider} from '@refinedev/core' +import axios, {AxiosError} from 'axios' + +// import {BACKEND_URL} from './lib/constants' +const API_URL = 'https://wn.krbl.ru' export const TOKEN_KEY = 'refine-auth' -export const authProvider: AuthProvider = { - login: async ({username, email, password}) => { - if ((username || email) && password) { - localStorage.setItem(TOKEN_KEY, username) - return { - success: true, - redirectTo: '/', - } - } +class AuthError extends Error { + constructor(message: string) { + super(message) + this.name = 'AuthError' + } +} - return { - success: false, - error: { - name: 'LoginError', - message: 'Invalid username or password', - }, +export const authProvider: AuthProvider = { + login: async ({email, password}) => { + try { + const response = await axios.post(`${API_URL}/auth/login`, { + email, + password, + }) + + if (response.data.token) { + localStorage.setItem(TOKEN_KEY, response.data.token) + localStorage.setItem('user', JSON.stringify(response.data.user)) + + return { + success: true, + redirectTo: '/', + } + } + + throw new AuthError('Неверный email или пароль') + } catch (error) { + return { + success: false, + error: new AuthError('Неверный email или пароль'), + } } }, logout: async () => { + try { + await axios.post( + `${API_URL}/auth/logout`, + {}, + { + headers: { + Authorization: `Bearer ${localStorage.getItem(TOKEN_KEY)}`, + }, + }, + ) + } catch (error) { + console.error('Ошибка при выходе:', error) + } + localStorage.removeItem(TOKEN_KEY) + localStorage.removeItem('user') return { success: true, redirectTo: '/login', @@ -29,31 +63,75 @@ export const authProvider: AuthProvider = { }, check: async () => { const token = localStorage.getItem(TOKEN_KEY) - if (token) { + if (!token) { return { - authenticated: true, + authenticated: false, + redirectTo: '/login', + } + } + + try { + const response = await axios.get(`${API_URL}/auth/me`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }) + + if (response.status === 200) { + return { + authenticated: true, + } + } + } catch (error) { + localStorage.removeItem(TOKEN_KEY) + localStorage.removeItem('user') + return { + authenticated: false, + redirectTo: '/login', + error: new AuthError('Сессия истекла, пожалуйста, войдите снова'), } } return { authenticated: false, redirectTo: '/login', + error: new AuthError('Пожалуйста, войдите в систему'), } }, - getPermissions: async () => null, - getIdentity: async () => { + getPermissions: async () => { const token = localStorage.getItem(TOKEN_KEY) - if (token) { - return { - id: 1, - name: 'John Doe', - avatar: 'https://i.pravatar.cc/300', - } + if (!token) return null + + try { + const response = await axios.get(`${API_URL}/auth/permissions`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }) + return response.data.permissions + } catch (error) { + return null + } + }, + getIdentity: async () => { + const user = localStorage.getItem('user') + if (user) { + return JSON.parse(user) } return null }, onError: async (error) => { - console.error(error) + console.error('Ошибка:', error) + const status = (error as AxiosError)?.response?.status + if (status === 401 || status === 403) { + localStorage.removeItem(TOKEN_KEY) + localStorage.removeItem('user') + return { + logout: true, + redirectTo: '/login', + error: new AuthError('Сессия истекла, пожалуйста, войдите снова'), + } + } return {error} }, }