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'
class AuthError extends Error {
constructor(message: string) {
super(message)
this.name = 'AuthError'
}
}
export const authProvider: AuthProvider = { export const authProvider: AuthProvider = {
login: async ({username, email, password}) => { login: async ({email, password}) => {
if ((username || email) && password) { try {
localStorage.setItem(TOKEN_KEY, username) 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 { return {
success: true, success: true,
redirectTo: '/', redirectTo: '/',
} }
} }
throw new AuthError('Неверный email или пароль')
} catch (error) {
return { return {
success: false, success: false,
error: { error: new AuthError('Неверный email или пароль'),
name: 'LoginError', }
message: 'Invalid username or password',
},
} }
}, },
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 {
authenticated: false,
redirectTo: '/login',
}
}
try {
const response = await axios.get(`${API_URL}/auth/me`, {
headers: {
Authorization: `Bearer ${token}`,
},
})
if (response.status === 200) {
return { return {
authenticated: true, 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}
}, },
} }