·
SDK
Нативные виджеты аутентификации для всех платформ. Без WebView, без браузера. OAuth 2.0 + PKCE S256, TLS certificate pinning, безопасное хранение refresh-токена в платформенном keychain. Device Flow (RFC 8628) для ТВ, часов и консолей.
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 даёт пиксель-в-пиксель ту же картинку.
Три варианта кнопки
Виджет авторизации (интерактивный)
Переключите тему и язык — увидите ровно то же поведение, что у нативных SDK через TpidConfig.theme и TpidConfig.language.
Матрица платформ
| Платформа | SDK | Мин. OS | Native UI | Статус |
|---|---|---|---|---|
| Android phone/tablet | Kotlin | Android 7.0 (API 24) | Jetpack Compose | Available |
| Android TV | Kotlin (Device Flow) | Android 7.0 (API 24) | Compose Leanback | Available |
| Wear OS | Kotlin (Device Flow) | Wear OS 3 (API 30) | Compose for Wear | Available |
| iOS / iPadOS | Swift | iOS 15 | SwiftUI | Available |
| macOS | Swift | macOS 12 | SwiftUI | Available |
| tvOS | Swift (Device Flow) | tvOS 15 | SwiftUI | Available |
| watchOS | Swift (Device Flow) | watchOS 8 | SwiftUI | Available |
| visionOS | Swift | visionOS 1 | SwiftUI | Available |
| Windows 10/11 · Linux · macOS Desktop | JVM (Kotlin) | JDK 17 / Windows 10, Ubuntu 20.04, macOS 12 | Compose for Desktop | Available |
| Flutter (iOS+Android) | Dart wrapper вокруг native | Flutter 3.16 | Hosted native view | Q2 2026 |
| React Native | TS wrapper | RN 0.73 | Native fabric component | Q2 2026 |
| Windows WinUI 3 (native) | .NET 8 | Windows 10 1809 | WinUI 3 | Q3 2026 |
| Tizen · webOS · HarmonyOS | Device Flow (HTTP) | — | Партнёр | Device Flow |
| Xbox · PlayStation · Switch | Device 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.
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")) }
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 -> {} } } }
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-пиннингом через делегат.
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.
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) } } } }
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).
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")) }
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 -> {} } } } }
// 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 generatescode_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-pinsevery 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 storage — EncryptedSharedPreferences (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-versionat 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'ом версии.
Проверка целостности
.sha256. Проверьте перед использованием:"
data-en="Each archive ships with a .sha256 sidecar. Verify before use:"
data-zh="每个存档都附带 .sha256 文件。使用前进行验证:">
Рядом с каждым архивом лежит файл .sha256. Проверьте перед использованием:
# 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 |
|---|---|---|
| Загрузка… | ||
