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 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 TOKEN_KEY = 'refine-auth'
export const authProvider: AuthProvider = { class AuthError extends Error {
login: async ({username, email, password}) => { constructor(message: string) {
if ((username || email) && password) { super(message)
localStorage.setItem(TOKEN_KEY, username) this.name = 'AuthError'
return { }
success: true, }
redirectTo: '/',
}
}
return { export const authProvider: AuthProvider = {
success: false, login: async ({email, password}) => {
error: { try {
name: 'LoginError', const response = await axios.post(`${API_URL}/auth/login`, {
message: 'Invalid username or password', 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 () => { 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(TOKEN_KEY)
localStorage.removeItem('user')
return { return {
success: true, success: true,
redirectTo: '/login', redirectTo: '/login',
@ -29,31 +63,75 @@ export const authProvider: AuthProvider = {
}, },
check: async () => { check: async () => {
const token = localStorage.getItem(TOKEN_KEY) const token = localStorage.getItem(TOKEN_KEY)
if (token) { if (!token) {
return { 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 { return {
authenticated: false, authenticated: false,
redirectTo: '/login', redirectTo: '/login',
error: new AuthError('Пожалуйста, войдите в систему'),
} }
}, },
getPermissions: async () => null, getPermissions: async () => {
getIdentity: async () => {
const token = localStorage.getItem(TOKEN_KEY) const token = localStorage.getItem(TOKEN_KEY)
if (token) { if (!token) return null
return {
id: 1, try {
name: 'John Doe', const response = await axios.get(`${API_URL}/auth/permissions`, {
avatar: 'https://i.pravatar.cc/300', 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 return null
}, },
onError: async (error) => { 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} return {error}
}, },
} }