TOKEN PAY

· SDK

Нативные виджеты аутентификации для всех платформ. Без WebView, без браузера. OAuth 2.0 + PKCE S256, TLS certificate pinning, безопасное хранение refresh-токена в платформенном keychain. Device Flow (RFC 8628) для ТВ, часов и консолей.

Pre-release. SDK распространяются как source-релизы по NDA для утверждённых партнёров. Публикация в Maven Central / SwiftPM registry запланирована на Q2 2026. Запросить доступ — dev@tokenpay.space.

Актуальные релизы

.sha256 рядом)." data-en="Download directly. Each artifact ships with a SHA-256 checksum (.sha256 sidecar)." data-zh="直接下载。每个构件都附带 SHA-256 校验和(.sha256 附属文件)。"> Скачивайте напрямую. Каждый артефакт подписан SHA-256 (файл .sha256 рядом).

Live preview — кнопки и виджет

v2.6.0 Точная HTML/CSS-реплика того, как нативный TpidLoginButton и виджет выглядят в Android (Compose), Swift (SwiftUI) и JVM Desktop (Compose for Desktop). UI трёх SDK даёт пиксель-в-пиксель ту же картинку.

Три варианта кнопки

DARK PILL · variant = DARK для светлого фона приложения
LIGHT PILL · variant = LIGHT для тёмного фона приложения
ICON ONLY · variant = ICON_ONLY 48×48 — tab-bar, header, FAB

Виджет авторизации (интерактивный)

Переключите тему и язык — увидите ровно то же поведение, что у нативных SDK через TpidConfig.theme и TpidConfig.language.

maria@example.com

maria@example.com

maria@example.com

Полная документацияна /docs со всеми экранами и code-snippets.

Матрица платформ

Платформа SDK Мин. OS Native UI Статус
Android phone/tabletKotlinAndroid 7.0 (API 24)Jetpack ComposeAvailable
Android TVKotlin (Device Flow)Android 7.0 (API 24)Compose LeanbackAvailable
Wear OSKotlin (Device Flow)Wear OS 3 (API 30)Compose for WearAvailable
iOS / iPadOSSwiftiOS 15SwiftUIAvailable
macOSSwiftmacOS 12SwiftUIAvailable
tvOSSwift (Device Flow)tvOS 15SwiftUIAvailable
watchOSSwift (Device Flow)watchOS 8SwiftUIAvailable
visionOSSwiftvisionOS 1SwiftUIAvailable
Windows 10/11 · Linux · macOS DesktopJVM (Kotlin)JDK 17 / Windows 10, Ubuntu 20.04, macOS 12Compose for DesktopAvailable
Flutter (iOS+Android)Dart wrapper вокруг nativeFlutter 3.16Hosted native viewQ2 2026
React NativeTS wrapperRN 0.73Native fabric componentQ2 2026
Windows WinUI 3 (native).NET 8Windows 10 1809WinUI 3Q3 2026
Tizen · webOS · HarmonyOSDevice Flow (HTTP)ПартнёрDevice Flow
Xbox · PlayStation · SwitchDevice Flow (HTTP)ПартнёрDevice Flow

Android SDK · Kotlin + Jetpack Compose

Полностью нативный виджет без браузера. Min SDK 24 (Android 7.0), Target SDK 34. Зависимости: AndroidX Credentials, EncryptedSharedPreferences, OkHttp 4.12, Kotlin Coroutines.

1. Скачать и подключить
curl -L -O https://tokenpay.space/sdk/android/tokenpay-id-android-2.6.0.tar.gz
sha256sum -c tokenpay-id-android-2.6.0.tar.gz.sha256
tar -xzf tokenpay-id-android-2.6.0.tar.gz

# settings.gradle.kts
include(":tokenpay-id-sdk")
project(":tokenpay-id-sdk").projectDir = file("sdk/android/tokenpay-id-sdk")

# app/build.gradle.kts
dependencies { implementation(project(":tokenpay-id-sdk")) }
2. Compose usage
import space.tokenpay.id.*

// Application.onCreate()
TpidAuth.initialize(context, TpidConfig(
    clientId = "tpid_pk_your_key",
    redirectUri = "com.cupol.vpn:/auth/callback"
))

@Composable fun Login() {
    TpidLoginButton { result ->
        when (result) {
            is TpidResult.Success -> navigate(result.accessToken)
            is TpidResult.Failure -> toast(result.error.code)
            TpidResult.Cancelled -> {}
        }
    }
}

Полная документация в /docs →

Swift SDK · SwiftUI

ASWebAuthenticationSession. URLSession с SPKI-пиннингом через делегат." data-en="One package for iOS 15+, iPadOS 15+, macOS 12+, tvOS 15+, watchOS 8+, visionOS 1+. Pure SwiftUI, no ASWebAuthenticationSession. URLSession with SPKI pinning via delegate." data-zh="一个包支持 iOS 15+、iPadOS 15+、macOS 12+、tvOS 15+、watchOS 8+、visionOS 1+。纯 SwiftUI 实现,无 ASWebAuthenticationSession。URLSession 通过委托进行 SPKI 固定。"> Единый пакет для iOS 15+, iPadOS 15+, macOS 12+, tvOS 15+, watchOS 8+, visionOS 1+. Чистая SwiftUI-реализация, без ASWebAuthenticationSession. URLSession с SPKI-пиннингом через делегат.

1. Скачать и добавить в Xcode
curl -L -O https://tokenpay.space/sdk/swift/tokenpay-id-swift-2.6.0.tar.gz
shasum -a 256 -c tokenpay-id-swift-2.6.0.tar.gz.sha256
tar -xzf tokenpay-id-swift-2.6.0.tar.gz

# Xcode → File → Add Package Dependencies… → Add Local…
# Select the unpacked folder and add the TokenPayID product.
2. SwiftUI usage
import SwiftUI
import TokenPayID

@main struct MyApp: App {
    init() {
        TpidAuth.shared.initialize(config: .init(
            clientId: "tpid_pk_your_key",
            redirectURI: URL(string: "com.cupol.vpn:/auth/callback")!
        ))
    }
    var body: some Scene { WindowGroup { ContentView() } }
}

struct ContentView: View {
    var body: some View {
        TpidLoginButton { result in
            switch result {
            case .success(let s): print(s.user.email)
            case .cancelled: break
            case .failure(let e): print(e.code)
            }
        }
    }
}

Полная документация в /docs →

Desktop JVM SDK · Kotlin + Compose for Desktop

ComposePanel, JavaFX через ComposeFxPanel или standalone.)" data-en="One Kotlin package for JVM desktops: Windows 10/11, Linux (GNOME/KDE/any X11 or Wayland), macOS 12+. Uses JetBrains Compose for Desktop (same programming model as Jetpack Compose). Embeds into any JVM app (Swing via ComposePanel, JavaFX via ComposeFxPanel, or standalone)." data-zh="适用于 JVM 桌面的统一 Kotlin 包:Windows 10/11、Linux (GNOME/KDE/任意 X11 或 Wayland)、macOS 12+。使用 JetBrains Compose for Desktop(与 Jetpack Compose 相同的编程模型)。嵌入任何 JVM 应用程序。"> Единый Kotlin-пакет для десктопов на JVM: Windows 10/11, Linux (GNOME/KDE/любой X11 или Wayland), macOS 12+. Использует JetBrains Compose for Desktop (та же программная модель, что и Jetpack Compose). Работает в любом JVM приложении (IntelliJ-like IDE, Swing-проект через ComposePanel, JavaFX через ComposeFxPanel, или standalone).

1. Скачать и подключить
curl -L -O https://tokenpay.space/sdk/jvm-desktop/tokenpay-id-jvm-desktop-2.6.0.tar.gz
sha256sum -c tokenpay-id-jvm-desktop-2.6.0.tar.gz.sha256
tar -xzf tokenpay-id-jvm-desktop-2.6.0.tar.gz

# settings.gradle.kts
include(":tokenpay-id-jvm")
project(":tokenpay-id-jvm").projectDir = file("sdk/jvm-desktop/tokenpay-id-jvm")

# app/build.gradle.kts
plugins { id("org.jetbrains.compose") version "1.6.10" }
dependencies { implementation(project(":tokenpay-id-jvm")) }
2. Compose for Desktop usage
import androidx.compose.ui.window.*
import space.tokenpay.id.jvm.*

fun main() = application {
    TpidAuth.initialize(TpidConfig(
        clientId = "tpid_pk_your_key",
        redirectUri = "cupol-vpn://auth/callback"
    ))
    Window(onCloseRequest = ::exitApplication, title = "My App") {
        TpidLoginButton { result ->
            when (result) {
                is TpidResult.Success -> println("Signed in: ${result.session.user.email}")
                is TpidResult.Failure -> println("Error: ${result.error.code}")
                TpidResult.Cancelled -> {}
            }
        }
    }
}
3. Embed in Swing / JavaFX
// Swing
import androidx.compose.ui.awt.ComposePanel
val panel = ComposePanel()
panel.setContent { TpidLoginButton { /* ... */ } }
jframe.add(panel)

// JavaFX — wrap ComposePanel in SwingNode
val node = SwingNode()
SwingUtilities.invokeLater {
    val p = ComposePanel()
    p.setContent { TpidLoginButton { /* ... */ } }
    node.setContent(p)
}

Безопасное хранение refresh-токена: Windows DPAPI, macOS Keychain (через Security.framework), Linux libsecret или KWallet; fallback — AES-GCM 256 файл, ключ выведен через PBKDF2 от machine-id + user.

Модель угроз

  • PKCE S256 обязателенcode_verifier + code_challenge, приложение никогда не видит пароль." data-en="SDK generates code_verifier + code_challenge; the app never sees the password." data-zh="SDK 生成 code_verifier + code_challenge;应用程序永远看不到密码。">SDK генерирует code_verifier + code_challenge, приложение никогда не видит пароль.
  • TLS pinning/sdk/tls-pins каждые 24ч. Mismatch → clear keychain + TpidError.phishingDetected." data-en="OkHttp CertificatePinner on Android/JVM; URLSessionDelegate SPKI SHA-256 on Apple. Pins auto-refresh from /sdk/tls-pins every 24h. Mismatch → clear keychain + TpidError.phishingDetected." data-zh="Android/JVM 上的 OkHttp CertificatePinner;Apple 上的 URLSessionDelegate SPKI SHA-256。每 24 小时从 /sdk/tls-pins 自动刷新 pin。不匹配 → 清除钥匙串 + TpidError.phishingDetected。">OkHttp CertificatePinner на Android/JVM; URLSessionDelegate SPKI SHA-256 на Apple. Пины автоматически рефрешатся из /sdk/tls-pins каждые 24ч. Mismatch → clear keychain + TpidError.phishingDetected.
  • Secure storageEncryptedSharedPreferences (Android), Keychain (Apple), DPAPI/libsecret/Keychain (Desktop JVM). Refresh-токен никогда не попадает в plaintext-файл или SharedPreferences без шифрования.
  • Защита от скриншотовFLAG_SECURE (Android), NSWindow.sharingType = .none (macOS), SetWindowDisplayAffinity(WDA_MONITOR) (Windows через JNA).
  • Версия сессииGET /auth/session-version при старте; сервер может инвалидировать все сессии пользователя одним bump'ом версии." data-en="SDK checks GET /auth/session-version at startup; server can invalidate all user sessions with a single version bump." data-zh="SDK 在启动时检查 GET /auth/session-version;服务器可以通过单次版本升级使所有用户会话失效。">SDK проверяет GET /auth/session-version при старте; сервер может инвалидировать все сессии пользователя одним bump'ом версии.

Подробнее: модель угроз native widget в /docs →

Проверка целостности

.sha256. Проверьте перед использованием:" data-en="Each archive ships with a .sha256 sidecar. Verify before use:" data-zh="每个存档都附带 .sha256 文件。使用前进行验证:"> Рядом с каждым архивом лежит файл .sha256. Проверьте перед использованием:

bash / PowerShell
# Linux / macOS
sha256sum -c tokenpay-id-android-2.6.0.tar.gz.sha256

# Windows PowerShell
(Get-FileHash tokenpay-id-android-2.6.0.tar.gz -Algorithm SHA256).Hash.ToLower() |
  Compare-Object (Get-Content tokenpay-id-android-2.6.0.tar.gz.sha256).Split(" ")[0]

SHA-256 текущих артефактов

Файл Размер SHA-256
Загрузка…

Нужна помощь?

Свяжитесь с нашей командой разработчиков