Skip to content

Аутентификация

Kodzero SDK предоставляет полный набор методов для работы с аутентификацией пользователей.

Обзор

Модуль аутентификации доступен через kodzero.auth и поддерживает:

  • Регистрацию новых пользователей
  • Авторизацию по email и паролю
  • Проверку токена
  • Обновление токена
  • Выход из системы
  • Ручное управление токенами

Методы аутентификации

Регистрация

typescript
const result = await kodzero.auth.register({
  email: 'user@example.com',
  password: 'secure_password123',
  name: 'Иван Иванов'        // опционально
  // ...другие поля
})

Ответ:

typescript
{
  user: {
    _id: 'user_id',
    email: 'user@example.com',
    name: 'Иван Иванов',
    workspace: 'workspace_id',
    createdAt: '2024-01-01T00:00:00.000Z',
    updatedAt: '2024-01-01T00:00:00.000Z'
  },
  tokens: {
    access: 'access_token_string',
    refresh: 'refresh_token_string'
  },
  session: 1234567890
}

Автоматическое сохранение токенов

После успешной регистрации токены автоматически сохраняются в tokensManager и добавляются ко всем последующим запросам.

Авторизация

typescript
const result = await kodzero.auth.login({
  email: 'user@example.com',
  password: 'secure_password123'
})

Ответ:

typescript
{
  user: {
    _id: 'user_id',
    email: 'user@example.com',
    name: 'Иван Иванов',
    // ...
  },
  tokens: {
    access: 'access_token_string',
    refresh: 'refresh_token_string'
  },
  session: 1234567890
}

Проверка токена

Проверяет валидность текущего access-токена:

typescript
const isValid = await kodzero.auth.verify()

if (isValid) {
  console.log('Пользователь авторизован')
} else {
  console.log('Токен недействителен')
}

Примечание

Метод verify() возвращает false при любой ошибке, включая сетевые проблемы. Это поведение предотвращает ложные срабатывания.

Обновление токена

Обновляет access-токен с помощью refresh-токена:

typescript
const result = await kodzero.auth.refresh()

if (result.tokens) {
  console.log('Токен успешно обновлён')
} else {
  console.log('Не удалось обновить токен')
}

Ответ при успехе:

typescript
{
  tokens: {
    access: 'new_access_token',
    refresh: 'new_refresh_token'
  }
}

Ответ при ошибке:

typescript
{
  tokens: null
}

Выход из системы

typescript
const success = await kodzero.auth.logout()

if (success) {
  console.log('Выход выполнен')
  // Перенаправьте пользователя на страницу входа
}

После успешного выхода токены автоматически очищаются.

Ручное управление токенами

Установка токенов

Полезно для восстановления сессии при перезагрузке страницы:

typescript
// Восстановление токенов из localStorage
const accessToken = localStorage.getItem('access_token')
const refreshToken = localStorage.getItem('refresh_token')

if (accessToken && refreshToken) {
  kodzero.auth.setTokens(accessToken, refreshToken)
}

Очистка токенов

typescript
kodzero.auth.clearTokens()

Практические примеры

Персистентная авторизация

typescript
// При старте приложения
function initAuth() {
  const accessToken = localStorage.getItem('kodzero_access')
  const refreshToken = localStorage.getItem('kodzero_refresh')
  
  if (accessToken && refreshToken) {
    kodzero.auth.setTokens(accessToken, refreshToken)
  }
}

// После успешной авторизации — сохраняем токены
async function login(email: string, password: string) {
  const result = await kodzero.auth.login({ email, password })
  
  localStorage.setItem('kodzero_access', result.tokens.access)
  localStorage.setItem('kodzero_refresh', result.tokens.refresh)
  
  return result
}

// При выходе — очищаем
async function logout() {
  await kodzero.auth.logout()
  localStorage.removeItem('kodzero_access')
  localStorage.removeItem('kodzero_refresh')
}

Автоматическое обновление токена

typescript
async function makeAuthenticatedRequest(requestFn: () => Promise<any>) {
  try {
    return await requestFn()
  } catch (error) {
    // Если токен истёк — пробуем обновить
    if (error.statusCode === 401) {
      const refreshResult = await kodzero.auth.refresh()
      
      if (refreshResult.tokens) {
        // Повторяем запрос с новым токеном
        return await requestFn()
      } else {
        // Refresh токен тоже истёк — выходим
        kodzero.auth.clearTokens()
        throw new Error('Сессия истекла')
      }
    }
    throw error
  }
}

React Hook для аутентификации

typescript
import { useState, useEffect, createContext, useContext } from 'react'
import { kodzero } from '@/services/kodzero'

interface AuthContextType {
  user: any | null
  isLoading: boolean
  login: (email: string, password: string) => Promise<void>
  logout: () => Promise<void>
}

const AuthContext = createContext<AuthContextType | null>(null)

export function AuthProvider({ children }) {
  const [user, setUser] = useState(null)
  const [isLoading, setIsLoading] = useState(true)

  useEffect(() => {
    // Проверяем сохранённые токены при старте
    const accessToken = localStorage.getItem('kodzero_access')
    const refreshToken = localStorage.getItem('kodzero_refresh')

    if (accessToken && refreshToken) {
      kodzero.auth.setTokens(accessToken, refreshToken)
      kodzero.auth.verify().then(isValid => {
        if (!isValid) {
          localStorage.removeItem('kodzero_access')
          localStorage.removeItem('kodzero_refresh')
        }
        setIsLoading(false)
      })
    } else {
      setIsLoading(false)
    }
  }, [])

  const login = async (email: string, password: string) => {
    const result = await kodzero.auth.login({ email, password })
    setUser(result.user)
    localStorage.setItem('kodzero_access', result.tokens.access)
    localStorage.setItem('kodzero_refresh', result.tokens.refresh)
  }

  const logout = async () => {
    await kodzero.auth.logout()
    setUser(null)
    localStorage.removeItem('kodzero_access')
    localStorage.removeItem('kodzero_refresh')
  }

  return (
    <AuthContext.Provider value={{ user, isLoading, login, logout }}>
      {children}
    </AuthContext.Provider>
  )
}

export const useAuth = () => useContext(AuthContext)

Следующие шаги

Опубликовано под лицензией ISC.