update authProvider for custom auth

This commit is contained in:
maxim 2025-03-19 21:42:09 +03:00
parent 497d6a3dd3
commit fb0deab271

View File

@ -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}
},
}