Добро пожаловать в Patreon Authenticator for Unity
Полноценный пакет Unity для интеграции аутентификации Patreon OAuth 2.0 со встроенным HTTP-сервером, расширенными функциями безопасности и кроссплатформенной совместимостью.
Начало работы
Patreon Authenticator for Unity — мощный плагин для бесшовной интеграции ваших игр на Unity с системой аутентификации Patreon. С ним вы можете:
- Расширенная безопасность: шифрование AES-256, обфускация и безопасное хранение
- Встроенный HTTP-сервер: встроенный HTTP-слушатель для колбэков OAuth
- Поддержка middleware: собственный middleware для колбэков OAuth на всех платформах
- Кроссплатформенность: работает на WebGL, Android, iOS, Windows, Mac и Linux
- Безопасное управление токенами: шифрование с привязкой к устройству и выводом ключа PBKDF2
- Потокобезопасные операции: корректная обработка HTTP-запросов
- Красивый интерфейс колбэка: настраиваемые HTML-страницы успеха и ошибки
- Проверка state: защита от CSRF с проверкой параметра state
- Обновление токена: автоматическое обновление токена доступа
- Получение профиля пользователя: данные пользователя и сведения о подписке
- Тесты безопасности: встроенные инструменты проверки и тестирования безопасности
- Поддержка GIF: анимированные аватары Patreon с поддержкой GIF-анимации
Требования
Перед началом убедитесь, что у вас есть:
- Unity 2021.3 LTS или новее
- .NET Standard 2.1 или новее
- Аккаунт автора на Patreon
- Базовые знания Unity и C#
- Подключение к интернету для запросов к API Patreon
Важное примечание
Плагину нужен Unity 2021.3 LTS или новее. Старые версии не поддерживаются.
Установка
1. Установите пакет Newtonsoft.Json (обязательно)
ВАЖНО: этот шаг обязателен перед использованием плагина!
- Откройте Package Manager в Unity (
Window → Package Manager) - Нажмите кнопку «+»
- Выберите «Install package by name…»
- Enter
com.unity.nuget.newtonsoft-json - Нажмите «Add», чтобы установить пакет
Без этого пакета скрипты не скомпилируются!
2. Скопируйте файлы плагина
- Скопируйте папку
Assets/Plugins/PatreonAuthenticatorForUnity/в свой проект Unity - Скопируйте файл
Assets/StreamingAssets/patreon-callback.htmlв папку StreamingAssets
3. Настройка сцены
- Создайте ассет PatreonConfig:
- Перейдите в папку Resources (создайте её, если её нет)
- Щёлкните правой кнопкой в окне Project
- Перейдите в
Create → Patreon Authenticator for Unity → Create New Config - Ассет будет создан в папке
Assets/Resources/(PatreonConfig) - Задайте базовые настройки (см. раздел «Настройка» ниже)
- Client ID и Client Secret задаются позже скриптом PatreonReEncryptCredentials
- Создайте GameObject PatreonManager:
- Щёлкните правой кнопкой в окне Hierarchy
- Выберите
Create Empty - Переименуйте GameObject в
PatreonManager
- Добавьте нужные скрипты в PatreonManager:
- Выберите GameObject
PatreonManager - Add Component → скрипт
PatreonManager - ВАЖНО: назначьте ассет PatreonConfig в поле «Patreon Config»
- Add Component → скрипт
PatreonCallbackManager(работает на всех платформах, требует компоненты ниже) - Add Component → скрипт
PatreonEmbeddedServer(только десктопные платформы) - Add Component → скрипт
PatreonDeepLinkHandler(только мобильные платформы) - Add Component → скрипт
PatreonWebGLHandler(только платформа WebGL)
Все скрипты совместимы и могут использоваться вместе.
- Выберите GameObject
-
Настройка для платформ:
📱 Мобильные платформы (Android/iOS):
- Будет автоматически использоваться
PatreonDeepLinkHandler - Настройка Android: добавьте в свой
AndroidManifest.xml:<activity android:name="com.unity3d.player.UnityPlayerActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="PatreonAuthenticatorForUnity.oauth" /> </intent-filter> </activity> - Настройка iOS: добавьте в свой
Info.plist:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>Patreon OAuth</string> <key>CFBundleURLSchemes</key> <array> <string>PatreonAuthenticatorForUnity.oauth</string> </array> </dict> </array>
🌐 Платформа WebGL:
- Будет автоматически использоваться
PatreonWebGLHandler - Использует middleware для колбэков OAuth (дополнительная настройка не нужна)
🖥️ Десктопные платформы (Windows/Mac/Linux):
- Будет автоматически использоваться
PatreonEmbeddedServer - Создаёт локальный HTTP-сервер на
localhost:3000
- Будет автоматически использоваться
- О middleware:
- Все платформы используют middleware для колбэков OAuth
- Middleware обрабатывает поток OAuth и перенаправляет в ваше приложение
- Собственная URI-схема: задаётся в PatreonConfig (по умолчанию:
PatreonAuthenticatorForUnity.oauth) - Бесплатный вариант middleware: можно создать свой middleware на GitHub Pages
- Скопируйте код middleware из
Assets/StreamingAssets/patreon-callback.html - Разместите его на GitHub Pages — это бесплатный middleware
- Обновите redirect URI в PatreonConfig, чтобы он указывал на ваш middleware
- Собственная URI-схема: настройте middleware на вашу URI-схему из PatreonConfig
- Проверьте настройку:
- На GameObject PatreonManager должны быть все нужные скрипты
- PatreonConfig должен быть назначен в компоненте PatreonManager
- В Console не должно быть ошибок компиляции
Установка завершена
После импорта из Unity Asset Store в каталоге Assets/Plugins должна появиться папка 'PatreonAuthenticatorForUnity'.
Функции безопасности
Продвинутая система шифрования
Плагин включает полноценную систему безопасности для защиты ваших учётных данных Patreon:
Шифрование AES-256
- Client Secret шифруется AES-256 с ключами, привязанными к устройству
- Вывод ключа PBKDF2 с 10,000 итерациями для максимальной безопасности
- Шифрование с привязкой к устройству — ключи уникальны для каждого устройства/приложения
- Автоматическая генерация IV для каждой операции шифрования
XOR-обфускация
- Client ID обфусцируется XOR-шифрованием
- Кодирование Base64 для безопасного хранения
- Лёгкая защита, подходящая для публичных идентификаторов
Безопасное хранение
- Зашифрованное хранилище PlayerPrefs для чувствительных данных
- Автоматическая очистка чувствительных данных из памяти
- Методы безопасного удаления сохранённых данных
Проверка безопасности
- Встроенные тесты безопасности с компонентом
PatreonSecurityTest - Автоматическая проверка операций шифрования/расшифровки
- Тесты производительности для операций безопасности
- Проверка безопасности памяти
Уровни безопасности
| Уровень | Client ID | Client Secret | Применение |
|---|---|---|---|
| Максимальный | Обфусцирован | Зашифрован | Продакшен |
| Высокий | Открытый текст | Зашифрован | Разработка |
| Средний | Обфусцирован | Открытый текст | Тестирование |
| Нет | Открытый текст | Открытый текст | НЕ РЕКОМЕНДУЕТСЯ |
Рекомендации по безопасности
- Всегда включайте шифрование Client Secret в продакшене
- Используйте обфускацию Client ID, когда это возможно
- Никогда не коммитьте PatreonConfig.asset в систему контроля версий
- Проверьте систему безопасности перед сборкой для продакшена
- Используйте безопасное хранение для любых чувствительных данных
- Очищайте чувствительные данные из памяти, когда они больше не нужны
КРИТИЧНО: безопасная настройка учётных данных
ЭТО ЧРЕЗВЫЧАЙНО ВАЖНО ДЛЯ БЕЗОПАСНОСТИ!
Ваши учётные данные Patreon (Client ID и Client Secret) крайне чувствительны и должны быть зашифрованы перед использованием. НИКОГДА не храните их открытым текстом!
Почему это важно
- Открытый текст = угроза безопасности: если учётные данные хранятся открытым текстом, их может украсть любой, у кого есть доступ к вашей сборке
- Финансовые последствия: украденные учётные данные дают доступ к вашему аккаунту Patreon и могут привести к финансовому ущербу
- Профессиональные последствия: утечки могут навредить вашей репутации и доверию пользователей
- Юридические последствия: недостаточные меры безопасности могут привести к юридическим проблемам
Как безопасно настроить учётные данные
Чтобы зашифровать учётные данные Patreon, выполните эти шаги:
Шаг 1: Создайте GameObject для повторного шифрования
- Создайте новый пустой GameObject в сцене
- Переименуйте его, например в
"PatreonEncryptCredentials"(потом вы его удалите) - Добавьте скрипт
PatreonEncryptCredentialsна GameObject
Шаг 2: Введите настоящие учётные данные
- Выберите GameObject в Hierarchy
- В Inspector появится скрипт повторного шифрования с понятными инструкциями
- Введите настоящие учётные данные в соответствующие поля:
Real Client Id: ваш Client ID PatreonReal Client Secret: ваш Client Secret Patreon
Шаг 3: Назначьте PatreonConfig (необязательно, но рекомендуется)
- Перетащите ассет PatreonConfig в поле
PatreonConfig Asset - Если назначить PatreonConfig: значения задаются автоматически после шифрования
- Если не назначать PatreonConfig: зашифрованные значения придётся скопировать вручную
Шаг 4: Зашифруйте учётные данные заново
- Щёлкните правой кнопкой по скрипту в Inspector
- Выберите «Re-Encrypt All Credentials» в контекстном меню
- Дождитесь окончания процесса - в Console появятся сообщения об успехе
Шаг 5: Проверьте и уберите лишнее
- Проверьте Console на сообщения об успехе
- Если PatreonConfig был назначен: значения задаются автоматически
- Если PatreonConfig НЕ был назначен: скопируйте зашифрованные значения в PatreonConfig вручную
- Удалите GameObject - в сцене он больше не нужен
Настройка
Настройка Patreon
Перед настройкой плагина в Unity нужно подготовить приложение на Patreon:
- Станьте автором на Patreon:
- Чтобы регистрировать OAuth-клиенты, нужно быть автором на Patreon
- Перейдите в Patreon Developer Console
- Создайте OAuth-клиент:
- Нажмите «Create Client» или «Register New Client»
- Заполните данные приложения
- ВАЖНО: укажите redirect URI:
http://localhost:3000/patreon-callback - Он должен точно совпадать с redirect URI в PatreonConfig
- Получите учётные данные:
- Client ID: скопируйте из настроек OAuth-клиента
- Client Secret: скопируйте из настроек OAuth-клиента (держите в секрете!)
- Creator ID: ваше имя пользователя на Patreon (например, если ваш Patreon —
patreon.com/DryreL, то Creator ID —DryreL)
ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ:
- НИКОГДА никому не передавайте Client ID и Client Secret
- НИКОГДА не коммитьте эти значения в систему контроля версий
- НИКОГДА не публикуйте их на открытых форумах или в каналах Discord
- Эти учётные данные дают полный доступ к вашему аккаунту Patreon
Настройки Unity
Создав ассет PatreonConfig (см. «Настройка сцены» выше), настройте параметры API Patreon:
- Redirect URI:
http://localhost:3000/patreon-callback(должен совпадать с настройками консоли Patreon) - Creator ID: ваше имя пользователя на Patreon (например,
DryreLдляpatreon.com/DryreL) - Authentication Timeout: сколько ждать аутентификации пользователя (по умолчанию: 120 с)
КРИТИЧНО: Redirect URI в PatreonConfig должен точно совпадать с указанным в Patreon Developer Console!
ВАЖНО: никогда не коммитьте PatreonConfig в систему контроля версий!
- Добавьте
Assets/Resources/PatreonConfig.assetв свой.gitignore - Этот файл содержит чувствительные учётные данные API
Client ID и Client Secret задаются автоматически, когда вы используете скрипт PatreonEncryptCredentials!
🌐 Руководство по настройке middleware
Использование динамической URI-схемы
Теперь плагин использует систему middleware, благодаря которой все платформы работают с одним redirect URI.
1. Создание OAuth URL:
https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME
Примеры:
https://yourdomain.com/api/oauth/redirect?scheme=mygame.oauthhttps://yourdomain.com/api/oauth/redirect?scheme=awesomeapp.authhttps://yourdomain.com/api/oauth/redirect?scheme=unitygame.patreon
2. Настройки приложения Patreon:
- Redirect URI:
https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME - Client ID: как раньше
- Client Secret: как раньше
3. Настройка платформ:
Android (AndroidManifest.xml):
<activity android:name="com.unity3d.player.UnityPlayerActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="YOUR_APP_SCHEME" />
</intent-filter>
</activity>
iOS (Info.plist):
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Patreon OAuth</string>
<key>CFBundleURLSchemes</key>
<array>
<string>YOUR_APP_SCHEME</string>
</array>
</dict>
</array>
4. Настройка PatreonConfig:
Задайте собственную URI-схему в PatreonConfig:
- Custom URI Scheme: нужная вам схема (например,
mygame.oauth) - Redirect URI: обновите под URL вашего middleware
- Все изменения: через интерфейс PatreonConfig
5. Тестовый URL:
https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME&code=test123&state=test456
✅ Преимущества:
- Один middleware для всех игр
- Динамическая схема, своя для каждой игры
- Простая настройка: меняется только схема
- Автоматическое определение платформы
🔧 Использование:
- Выберите схему:
mygame.oauth - Настройки приложения Patreon:
https://yourdomain.com/api/oauth/redirect?scheme=mygame.oauth - Скопируйте файлы платформ и измените схему
- Укажите
customUriSchemeв Unity - Проверьте! 🎯
👑 Настройка Creator API (необязательно)
Для расширенных функций — данных кампании, списков участников и сведений об уровнях:
Шаг 1: Получите Creator's Access Token
- Перейдите в Patreon Developer Console
- Создайте «Creator’s Access Token» (не OAuth Client)
- Выберите scopes:
campaigns,campaigns.members,campaigns.tiers - Скопируйте Access Token и Refresh Token
Шаг 2: Включите Creator API
- В скрипте
PatreonEncryptCredentials:- ✅ Отметьте «Enable Creator API»
- Введите Creator Access Token
- Введите Creator Refresh Token
- Нажмите «Encrypt All Credentials»
- Значения автоматически запишутся в PatreonConfig
Альтернатива: ручная настройка
Токены Creator API можно задать и прямо в PatreonConfig:
- Creator Access Token: задаётся в PatreonConfig для доступа к данным кампании/участников
- Creator Refresh Token: задаётся в PatreonConfig для обновления токена
- Enable Creator API: включите в PatreonConfig для расширенных функций
Примечание: убедитесь, что шифрование выполнено!
Шаг 3: Используйте Creator API
// Get campaign information
StartCoroutine(PatreonManager.Instance.GetCampaignInfo());
// Get all campaign members/patrons
StartCoroutine(PatreonManager.Instance.GetCampaignMembers());
// Get campaign tiers/rewards
StartCoroutine(PatreonManager.Instance.GetCampaignTiers());
Шаг 4: Покажите в интерфейсе
Используйте PatreonUserInfoDisplay с новыми полями:
- Название кампании, Описание кампании, Число патронов
- Сумма уровня, Описание уровня, Лимит уровня
- Участник с, Статус подписки, Следующее списание
Справка: Patreon API Guide
Аутентификация
Процесс входа
Процесс аутентификации следует стандартам OAuth 2.0:
- Инициализируйте аутентификатор
- Запустите процесс входа
- Обработайте колбэк
- Проверьте токен
Вот простой пример:
using DryreL.Patreon;
public class PatreonManager : MonoBehaviour
{
private PatreonAuthenticator authenticator;
void Start()
{
authenticator = new PatreonAuthenticator();
authenticator.OnLoginSuccess += OnLoginSuccess;
authenticator.OnLoginFailed += OnLoginFailed;
}
public void Login()
{
authenticator.StartLogin();
}
private void OnLoginSuccess(PatreonUser user)
{
Debug.Log($"Welcome, {user.FullName}!");
// Handle successful login
}
private void OnLoginFailed(string error)
{
Debug.LogError($"Login failed: {error}");
// Handle login failure
}
}
Управление токенами
Плагин автоматически обновляет и хранит токены:
// Check if user is authenticated
if (authenticator.IsAuthenticated)
{
// Get current user
PatreonUser user = authenticator.CurrentUser;
// Check subscription status
bool isSubscriber = user.IsSubscriber;
string tier = user.SubscriptionTier;
}
Справочник API
Классы
PatreonManager
Основной класс-синглтон для аутентификации Patreon.
Свойства:
bool IsUserAuthenticated()- Возвращает true, если пользователь вошёлPatreonUser GetCurrentUser()- Возвращает текущего аутентифицированного пользователяstring GetValidAccessToken()- Возвращает действующий access token (при необходимости обновляет)
Методы:
void StartPatreonAuth()- Запускает OAuth-поток Patreonvoid Logout()- Выполняет выход текущего пользователя и очищает токеныvoid SetAccessToken(string token)- Устанавливает access tokenvoid ExchangeCodeForToken(string code, string state)- Обменивает код авторизации на access token
PatreonUser
Представляет пользователя Patreon вместе со сведениями о подписке.
Свойства:
string Id- Patreon ID пользователяstring FullName- Полное имя пользователяstring Email- Адрес электронной почты пользователяstring FirstName- Имя пользователяstring LastName- Фамилия пользователяstring Vanity- Персональный URL пользователяstring ImageUrl- URL фото профиля пользователяbool IsPatron- Является ли пользователь патрономfloat PledgeAmount- Сумма подписки в долларахbool HasPledge- Есть ли у пользователя активная подпискаstring DisplayName- Отображаемое имя пользователяstring PatronStatus- Статус патрона пользователяstring TierTitle- Название уровня подписки пользователяint CentsPledged- Сумма подписки в центах
Методы:
void LoadProfileAvatar(Action<Sprite> onComplete)- Загружает аватар профиля пользователя как Sprite
Методы
StartLogin()
Запускает OAuth-поток Patreon.
public void StartLogin()
Возвращает: void
Пример:
authenticator.StartLogin();
Logout()
Выполняет выход текущего пользователя и очищает сохранённые токены.
public void Logout()
Возвращает: void
Пример:
authenticator.Logout();
События
OnLoginSuccess
Срабатывает при успешном входе пользователя.
public event Action<PatreonUser> OnLoginSuccess;
Параметры:
PatreonUser user- Аутентифицированный пользователь
OnLoginFailed
Срабатывает при неудачном входе.
public event Action<string> OnLoginFailed;
Параметры:
string error- Сообщение с описанием ошибки
Примеры
Базовая аутентификация
using UnityEngine;
public class SimplePatreonExample : MonoBehaviour
{
void Start()
{
// Subscribe to events
PatreonManager.OnUserAuthenticated += HandleLoginSuccess;
PatreonManager.OnAuthenticationFailed += HandleLoginFailed;
}
public void LoginButtonClicked()
{
PatreonManager.Instance.StartPatreonAuth();
}
private void HandleLoginSuccess(PatreonUser user)
{
Debug.Log($"Welcome {user.FullName}!");
if (user.IsPatron)
{
Debug.Log($"You are a patron with tier: {user.TierTitle}");
Debug.Log($"Pledge amount: ${user.PledgeAmount:F2}");
// Unlock premium content
}
else
{
Debug.Log("You are not a patron");
// Show subscription prompt
}
}
private void HandleLoginFailed(string error)
{
Debug.LogError($"Login failed: {error}");
// Show error message to user
}
}
Управление премиум-контентом
public class PremiumContentManager : MonoBehaviour
{
[SerializeField] private PatreonAuthenticator authenticator;
[SerializeField] private GameObject premiumContent;
void Start()
{
CheckSubscriptionStatus();
}
private void CheckSubscriptionStatus()
{
if (authenticator.IsAuthenticated)
{
PatreonUser user = authenticator.CurrentUser;
if (user.IsSubscriber)
{
EnablePremiumContent(user.SubscriptionTier);
}
else
{
DisablePremiumContent();
}
}
else
{
DisablePremiumContent();
}
}
private void EnablePremiumContent(string tier)
{
premiumContent.SetActive(true);
// Configure content based on tier
switch (tier)
{
case "Bronze":
// Bronze tier features
break;
case "Silver":
// Silver tier features
break;
case "Gold":
// Gold tier features
break;
}
}
private void DisablePremiumContent()
{
premiumContent.SetActive(false);
}
}
Устранение неполадок
Частые проблемы
Ошибка «Invalid Client ID»
Проблема: при попытке аутентификации появляется ошибка «Invalid Client ID».
Решение:
- Проверьте Client ID в Patreon Developer Portal
- Убедитесь, что Client ID правильно введён в Project Settings Unity
- Убедитесь, что приложение правильно настроено на Patreon
Проблемы с обновлением токенов
Проблема: токены не обновляются автоматически.
Решение:
- Проверьте подключение к интернету
- Убедитесь, что Client Secret указан верно
- Убедитесь, что redirect URI совпадает в точности
Проблемы со сборками Unity
Проблема: плагин работает в редакторе, но не в сборках.
Решение:
- Убедитесь, что все нужные зависимости включены в сборку
- Проверьте, что настройка Patreon подготовлена для продакшена
- Убедитесь, что redirect URI доступен из опубликованного приложения
Режим отладки
Включите режим отладки для более подробного логирования:
PatreonConfig config = new PatreonConfig
{
// ... other settings
DebugMode = true
};
Поддержка платформ
| Платформа | Статус | Примечания |
|---|---|---|
| WebGL | ✅ Полная поддержка | Аутентификация в браузере со встроенным сервером |
| Android | ✅ Полная поддержка | Нативная интеграция с браузером, middleware (собственный URI) |
| iOS | ✅ Полная поддержка | Нативная интеграция с браузером, middleware (собственный URI) |
| Windows | ✅ Полная поддержка | 32- и 64-битные сборки |
| Mac | ✅ Полная поддержка | Поддержка universal binary |
| Linux | ✅ Полная поддержка | Все основные дистрибутивы |
Возможности на мобильных платформах
- Application.identifier: полная поддержка на iOS/Android
- Device ID: надёжные ключи шифрования для каждого устройства
- Системный браузер: нативный OAuth-поток с возвратом в приложение
- StreamingAssets: работа с файлами по платформам
- URL-схемы: собственная обработка колбэков
🔗 Обработка колбэков по платформам
Все платформы (единая система middleware)
- Один redirect URI:
https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME - Динамическая схема: у каждой игры может быть своя URI-схема
- Определение платформы: автоматическое определение и маршрутизация
- Универсальная поддержка: работает на компьютерах, мобильных и WebGL
Мобильные платформы (Android, iOS, Windows, UWP)
- Deep linking: собственная URI-схема (
YOUR_APP_SCHEME://patreon-callback) - Перенаправление middleware:
https://yourdomain.com/api/oauth/redirect→ deep link - Системный браузер: нативный OAuth-поток с автоматическим возвратом в приложение
- Проверка state: защита от CSRF с параметром state
Платформа WebGL
- Поток middleware: использует
https://yourdomain.com/api/oauth/redirect - JavaScript-колбэк: обмен
postMessageс родительским окном - Сервер не нужен: используется размещённый сервис middleware
- Поддержка CORS: обработка кросс-доменных запросов
Десктопные платформы (Windows, Mac, Linux)
- Перенаправление middleware:
https://yourdomain.com/api/oauth/redirect→localhost:3000 - Встроенный сервер: HTTP Listener на
localhost:3000 - Loopback-поток: браузер → middleware → localhost → колбэк приложения
- Без зависимостей: чистая реализация на HttpListener из .NET
📱 Требования к настройке на мобильных
Настройка Android
- Создайте AndroidManifest.xml в
Assets/Plugins/Android/: ```xml
#### **iOS Setup**
1. **Player Settings** → **Other** → **Configuration**
2. **Add to Supported URL schemes**: `YOUR_APP_SCHEME`
3. Make sure **ios-info.plist** created.
4. **Xcode**: Verify URL scheme registration
#### **Patreon OAuth Client Configuration**
- **All Platforms**: Use single redirect URI with middleware
- **Redirect URI**: `https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME`
- **Client Type**: Select "Web application" (works for all platforms)
- **Dynamic Scheme**: Each game uses its own URI scheme
### 🌐 **Unified Middleware System**
**Hosted Middleware**: `https://yourdomain.com/api/oauth/redirect`
**Features:**
- **Platform Detection**: Automatic platform detection and routing
- **Dynamic Scheme**: Each game uses its own URI scheme
- **Universal Support**: Works on Desktop, Mobile, and WebGL
- **No Setup Required**: Uses hosted middleware service
**Middleware Workflow:**
1. **Patreon** → `https://yourdomain.com/api/oauth/redirect?scheme=YOUR_APP_SCHEME&code=...&state=...`
2. **Middleware** → Platform detection
3. **Redirect** → Platform-specific callback method
### 🚀 **Usage Examples**
#### **Platform-Specific OAuth Flow**
```csharp
// Automatic platform detection and callback handling
PatreonCallbackManager callbackManager = GetComponent<PatreonCallbackManager>();
callbackManager.StartPatreonOAuthFlow(clientId, state);
// Get platform-specific redirect URI
string redirectUri = callbackManager.GetPlatformRedirectUri();
Debug.Log($"Platform redirect URI: {redirectUri}");
Обработка deep link на мобильных
// Mobile deep link callback (called by system)
PatreonDeepLinkHandler deepLinkHandler = GetComponent<PatreonDeepLinkHandler>();
deepLinkHandler.HandleDeepLinkCallback("myapp.oauth://patreon-callback?code=abc123&state=xyz789");
// Test deep link callback
deepLinkHandler.TestDeepLinkCallback();
Обработка middleware в WebGL
// WebGL middleware callback
PatreonWebGLHandler webGLHandler = GetComponent<PatreonWebGLHandler>();
webGLHandler.StartPatreonOAuthFlow(clientId, state);
// Test WebGL callback
webGLHandler.TestWebGLCallback();
Сведения о платформе
// Show current platform and callback method
PatreonCallbackManager callbackManager = GetComponent<PatreonCallbackManager>();
callbackManager.ShowPlatformInfo();
// Output:
// 📱 Current Platform: AndroidPlayer
// 📱 Redirect URI: myapp.oauth://patreon-callback
// 🔗 Using deep link callback method
🧪 Тестирование
Тестовые команды
Test Platform OAuth Flow: проверка OAuth-потока для платформыTest Deep Link Callback: проверка обработки deep link на мобильныхTest WebGL Callback: проверка обработки middleware в WebGLShow Platform Info: вывод сведений о текущей платформе
Тестовые скрипты
PatreonCallbackManager: тесты по платформамPatreonDeepLinkHandler: тесты deep link на мобильныхPatreonWebGLHandler: тесты middleware в WebGLPatreonMobileTest: тесты совместимости с мобильными
Тестирование безопасности
Плагин содержит полноценную систему тестирования безопасности:
1. Добавьте компонент Security Test
// Add PatreonSecurityTest component to any GameObject
// Right-click on GameObject → Add Component → PatreonSecurityTest
2. Запустите тесты безопасности
// In Inspector, click "Run All Security Tests" or use code:
var securityTest = GetComponent<PatreonSecurityTest>();
securityTest.RunAllTests();
3. Проверьте компоненты по отдельности
// Test encryption only
securityTest.TestEncryption();
// Test obfuscation only
securityTest.TestObfuscation();
// Test secure storage only
securityTest.TestSecureStorage();
// Performance test
securityTest.PerformanceTest();
4. Проверка безопасности
// Validate entire security system
bool isValid = PatreonSecurity.PatreonSecurity.ValidateSecuritySystem();
Debug.Log($"Security system valid: {isValid}");
Поддержка
Получить помощь
Если возникли проблемы или вопросы:
- Загляните в документацию - здесь разобраны самые частые проблемы
- Присоединяйтесь к нашему сообществу в Discord - помогут другие разработчики и наша команда
- Напишите в поддержку - по техническим вопросам укажите:
- Версию Unity
- Версию плагина
- Шаги для воспроизведения
- Сообщения об ошибках
- Файлы логов
Сообщество
Присоединяйтесь к сообществу за поддержкой и новостями:
- Почта: [email protected]
- Discord: Присоединиться к сообществу
- YouTube: DryreL Hub
- YouTube #2: DryreL Software
Обновления
Следите за новыми функциями и исправлениями:
- Unity Asset Store: Скачать в Marketplace (скоро)
- Сообщество в Discord: Присоединяйтесь к Discord DryreL Hub за поддержкой и новостями
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
ВАЖНОЕ УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ
Плагин предоставляет шифрование AES-256 и обфускацию для защиты учётных данных API Patreon. Однако ВЫ НЕСЁТЕ ПОЛНУЮ ОТВЕТСТВЕННОСТЬ за безопасность своих учётных данных и любые последствия их раскрытия.
Предоставляемые функции безопасности
- Шифрование AES-256: для защиты Client Secret
- XOR-обфускация: для обфускации Client ID
- Многоуровневый вывод ключей: ключи шифрования для каждой платформы
- Защита от вмешательства: базовая проверка целостности
- Журнал аудита безопасности: инструменты мониторинга и отладки
Ваши обязанности
- Безопасное хранение: никогда не коммитьте
PatreonConfigв систему контроля версий - Правильное использование: соблюдайте все рекомендации по безопасности из этой документации
- Регулярное обновление: поддерживайте учётные данные актуальными и периодически меняйте их
- Безопасность среды: убедитесь, что среды разработки и продакшена защищены
- Контроль доступа: ограничьте доступ к файлам с учётными данными и артефактам сборки
Ограничение ответственности
DRYREL HUB НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ за любой прямой, косвенный, случайный, особый, последующий или штрафной ущерб, включая, помимо прочего:
- Финансовые потери: потерю дохода, перерыв в работе или денежный ущерб
- Нарушения безопасности: несанкционированный доступ к вашему аккаунту или данным Patreon
- Злоупотребление API: использование ваших учётных данных третьими лицами
- Раскрытие данных: утечку чувствительной информации
- Перебои в работе: простои или недоступность сервиса
- Юридические последствия: любые правовые проблемы из-за раскрытия учётных данных
ИСПОЛЬЗУЙТЕ ЭТОТ ПЛАГИН НА СВОЙ СТРАХ И РИСК. НИКАКИХ ГАРАНТИЙ НЕ ПРЕДОСТАВЛЯЕТСЯ.
🔧 API V2: проблемы и решения для разных типов аккаунтов
⚠️ Известные проблемы с разными типами аккаунтов
При тестировании с разными типами аккаунтов Patreon (автор или обычный пользователь) могут возникнуть такие проблемы:
1. Не приходит e-mail
- Проблема: у обычных пользователей поле e-mail пустое
- Причина: ограничения scopes OAuth
- Решение: расширенные scopes OAuth теперь включают
identity[email]
2. Не приходит фото профиля
- Проблема: URL фото профиля пустой
- Причина: различия в сопоставлении полей API
- Решение: если
image_urlпустое, автоматически используетсяthumb_url
3. Неверные данные об уровне/статусе
- Проблема: обычные пользователи отображаются с уровнем «creator»
- Причина: несогласованность ответов API для разных типов аккаунтов
- Решение: расширенное логирование и проверка (см. предупреждения в консоли)
4. Не приходят ссылки на соцсети
- Проблема: ссылки на YouTube, Twitter, Facebook пустые
- Причина: ограниченный доступ к полям API для обычных пользователей
- Решение: расширенные запросы полей в вызовах API
🔍 Отладочная информация
Теперь плагин ведёт подробный отладочный лог. Проверьте в Console Unity:
🔧 === USER DATA DEBUG ===- Полный анализ данных пользователя🔧 Email not available- Предупреждения об ограничениях scopes🔧 Normal user has tier_title- Несоответствия типов аккаунтов
📋 Чек-лист тестирования
При тестировании с разными типами аккаунтов:
- Тест с аккаунтом автора:
- ✅ E-mail должен приходить
- ✅ Фото профиля должно приходить
- ✅ Данные об уровне должны быть верными
- ✅ Ссылки на соцсети могут быть доступны
- Тест с аккаунтом обычного пользователя:
- ⚠️ E-mail может быть недоступен (зависит от scope)
- ✅ Фото профиля должно приходить (с запасным вариантом)
- ⚠️ Данные об уровне могут быть неверными (пишется предупреждение)
- ⚠️ Ссылки на соцсети могут быть недоступны
🛠️ Расширенные scopes OAuth
Теперь плагин запрашивает расширенные scopes:
identity identity[email] identity.memberships campaigns
Это даёт лучший доступ к данным пользователя при разных типах аккаунтов.
🔧 Проверка и исправление данных API
Важно: плагин проверяет данные на стороне клиента и исправляет известные несоответствия Patreon API V2. Это нужно, потому что:
- Ошибки в данных API: Patreon API V2 иногда возвращает неверные данные для обычных пользователей (например, уровень «Creator»)
- Противоречия в данных: API может возвращать противоречивые значения (например,
patron_status: "not_patron", ноis_patron: true) - Смешение типов аккаунтов: в ответах API данные пользователя и автора иногда смешиваются
- Проблемы со статусом подписчика: поле
is_followerненадёжно и может вернутьfalse, даже если пользователь подписан
Что делает плагин:
- ✅ Проверяет все данные пользователя из API
- ✅ Автоматически исправляет известные несоответствия
- ✅ Логирует проблемы API для отладки
- ✅ Подставляет запасные значения, когда нужно
- ✅ Предупреждает о ненадёжных полях, например
is_follower
Сообщения консоли, за которыми стоит следить:
🔧 API ISSUE: Normal user has incorrect tier_title: Creator - fixing🔧 API ISSUE: is_follower is false - this might be incorrect due to Patreon API V2 limitations🔧 API DATA ISSUES DETECTED AND FIXED - This indicates Patreon API V2 data inconsistencies
Известные ограничения API:
is_follower: это поле ненадёжно в Patreon API V2 и может вернутьfalse, даже если пользователь подписан на автора- Определение подписчиков: для точного определения нужны дополнительные вызовы API к endpoints campaigns/pledges
- Справка: правильные способы определения подписчиков см. в Patreon API Guide
Такой подход даёт надёжные данные пользователя независимо от несоответствий API.
Спасибо!
Спасибо, что используете Patreon Authenticator for Unity. Надеемся, плагин поможет вам создавать отличные возможности для ваших патронов на Patreon!

