Tapok Hosted

Вход без Client ID с pairwise UID и минимальным набором данных.

Tapok Hosted

Hosted подходит сайту, которому нужны стабильный пользователь в пределах одного HTTP origin и признак 18+, но не нужны профиль или контакты. Регистрация приложения, Client ID и API key не требуются.

Быстрый старт

import { Tapok } from '@orria/tapok/browser'

const tapok = new Tapok({
  baseUrl: 'https://tapok.orria.space',
})

const result = await tapok.login()
console.log(result.user.uid, result.user.isAdult)

// На backend передайте result.token и проверьте его до создания сессии.

Script bundle поддерживает тот же вызов без new:

<script src="https://tapok.orria.space/tapok.js"></script>
<script>const result = await window.Tapok.login()</script>

Popup открывается синхронно из пользовательского действия. SDK проверяет origin и source сообщения, state, nonce, PKCE и ответ token endpoint. Разрешите popup для Tapok.

Рабочий пример

Hosted Todo показывает полный минимальный сценарий: Vanilla JS открывает вход, backend проверяет Hosted token, создаёт HttpOnly-сессию, а SQLite хранит отдельные задачи для каждого pairwise UID. Посмотреть исходный код →

Результат

{
  mode: 'hosted',
  tokenType: 'Bearer',
  token: string,
  expiresIn: 600,
  expiresAt: Date,
  user: {
    uid: `tpk_h_${string}`,
    isAdult: boolean | null,
  },
}

uid случаен, стабилен для пары «точный origin + пользователь» и отличается на другом origin. isAdult: null означает, что возраст нельзя надёжно определить. Hosted не передаёт имя, дату рождения, телефон, исходный идентификатор провайдера или глобальный идентификатор Tapok.

Это уменьшает объём передаваемых данных, но само по себе не является абсолютной гарантией анонимности и не отменяет обязанности владельца сайта оценить собственную обработку данных.

Origin и проверка на backend

Tapok привязывает запрос и JWT к точному scheme://host:port. В production допускается HTTPS; HTTP разрешён только для localhost и 127.0.0.1 в development. Смена схемы, host или порта создаёт другой UID и audience.

import { verifyHostedToken } from '@orria/tapok/server'

const verified = await verifyHostedToken(token, {
  origin: 'https://app.example',
  baseUrl: 'https://tapok.orria.space',
})
// verified.user: { uid, isAdult }

Не доверяйте декодированному JWT без проверки подписи, issuer, exact audience и срока действия. Не используйте browser storage как серверную авторизацию.

Ошибки и сессия

TapokHostedError.code принимает: popup_blocked, popup_closed, authorization_cancelled, authorization_timeout, invalid_origin, origin_mismatch, invalid_state, invalid_nonce, invalid_code, invalid_code_verifier, code_expired, code_already_used, session_expired, provider_unavailable, rate_limited, unknown_error.

  • getSession() возвращает локально сохранённый действующий результат или null;
  • logout() удаляет локальную сессию; уже выданный JWT перестаёт использоваться клиентом и истекает не позднее чем через 10 минут;
  • silent refresh не поддерживается: refresh() бросает session_expired, после чего запустите login() снова;
  • при удалении или отзыве связки старый UID нельзя считать действующей сессией: backend всё равно обязан проверять срок JWT и собственную сессию.

Токены, code, state, nonce и PKCE verifier не помещайте в логи или URL приложения. Callback Tapok очищает собственный URL до отправки результата через postMessage.

Когда перейти на Connect

Используйте Connect, если нужны scopes профиля, собственная долгоживущая интеграция, управляемый backend exchange или данные контакта. Hosted отклоняет профильные scopes и никогда не включает их в токен.