Назад к Unity

DryreL Software Документация

Patreon Authenticator for Unity

Полное руководство по интеграции Patreon Authenticator for Unity в ваши проекты Unity

Добро пожаловать в 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 (обязательно)

ВАЖНО: этот шаг обязателен перед использованием плагина!

  1. Откройте Package Manager в Unity (Window → Package Manager)
  2. Нажмите кнопку «+»
  3. Выберите «Install package by name…»
  4. Enter com.unity.nuget.newtonsoft-json
  5. Нажмите «Add», чтобы установить пакет

Без этого пакета скрипты не скомпилируются!

2. Скопируйте файлы плагина

  1. Скопируйте папку Assets/Plugins/PatreonAuthenticatorForUnity/ в свой проект Unity
  2. Скопируйте файл Assets/StreamingAssets/patreon-callback.html в папку StreamingAssets

3. Настройка сцены

  1. Создайте ассет PatreonConfig:
    • Перейдите в папку Resources (создайте её, если её нет)
    • Щёлкните правой кнопкой в окне Project
    • Перейдите в Create → Patreon Authenticator for Unity → Create New Config
    • Ассет будет создан в папке Assets/Resources/ (PatreonConfig)
    • Задайте базовые настройки (см. раздел «Настройка» ниже)
    • Client ID и Client Secret задаются позже скриптом PatreonReEncryptCredentials
  2. Создайте GameObject PatreonManager:
    • Щёлкните правой кнопкой в окне Hierarchy
    • Выберите Create Empty
    • Переименуйте GameObject в PatreonManager
  3. Добавьте нужные скрипты в PatreonManager:
    • Выберите GameObject PatreonManager
    • Add Component → скрипт PatreonManager
    • ВАЖНО: назначьте ассет PatreonConfig в поле «Patreon Config»
    • Add Component → скрипт PatreonCallbackManager (работает на всех платформах, требует компоненты ниже)
    • Add Component → скрипт PatreonEmbeddedServer (только десктопные платформы)
    • Add Component → скрипт PatreonDeepLinkHandler (только мобильные платформы)
    • Add Component → скрипт PatreonWebGLHandler (только платформа WebGL)

    Все скрипты совместимы и могут использоваться вместе.

  4. Настройка для платформ:

    📱 Мобильные платформы (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
  5. О 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
  6. Проверьте настройку:
    • На 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 Применение
Максимальный Обфусцирован Зашифрован Продакшен
Высокий Открытый текст Зашифрован Разработка
Средний Обфусцирован Открытый текст Тестирование
Нет Открытый текст Открытый текст НЕ РЕКОМЕНДУЕТСЯ

Рекомендации по безопасности

  1. Всегда включайте шифрование Client Secret в продакшене
  2. Используйте обфускацию Client ID, когда это возможно
  3. Никогда не коммитьте PatreonConfig.asset в систему контроля версий
  4. Проверьте систему безопасности перед сборкой для продакшена
  5. Используйте безопасное хранение для любых чувствительных данных
  6. Очищайте чувствительные данные из памяти, когда они больше не нужны

КРИТИЧНО: безопасная настройка учётных данных

ЭТО ЧРЕЗВЫЧАЙНО ВАЖНО ДЛЯ БЕЗОПАСНОСТИ!

Ваши учётные данные Patreon (Client ID и Client Secret) крайне чувствительны и должны быть зашифрованы перед использованием. НИКОГДА не храните их открытым текстом!

Почему это важно

  • Открытый текст = угроза безопасности: если учётные данные хранятся открытым текстом, их может украсть любой, у кого есть доступ к вашей сборке
  • Финансовые последствия: украденные учётные данные дают доступ к вашему аккаунту Patreon и могут привести к финансовому ущербу
  • Профессиональные последствия: утечки могут навредить вашей репутации и доверию пользователей
  • Юридические последствия: недостаточные меры безопасности могут привести к юридическим проблемам

Как безопасно настроить учётные данные

Чтобы зашифровать учётные данные Patreon, выполните эти шаги:

Шаг 1: Создайте GameObject для повторного шифрования

  1. Создайте новый пустой GameObject в сцене
  2. Переименуйте его, например в "PatreonEncryptCredentials" (потом вы его удалите)
  3. Добавьте скрипт PatreonEncryptCredentials на GameObject

Шаг 2: Введите настоящие учётные данные

  1. Выберите GameObject в Hierarchy
  2. В Inspector появится скрипт повторного шифрования с понятными инструкциями
  3. Введите настоящие учётные данные в соответствующие поля:
    • Real Client Id: ваш Client ID Patreon
    • Real Client Secret: ваш Client Secret Patreon
  1. Перетащите ассет PatreonConfig в поле PatreonConfig Asset
  2. Если назначить PatreonConfig: значения задаются автоматически после шифрования
  3. Если не назначать PatreonConfig: зашифрованные значения придётся скопировать вручную

Шаг 4: Зашифруйте учётные данные заново

  1. Щёлкните правой кнопкой по скрипту в Inspector
  2. Выберите «Re-Encrypt All Credentials» в контекстном меню
  3. Дождитесь окончания процесса - в Console появятся сообщения об успехе

Шаг 5: Проверьте и уберите лишнее

  1. Проверьте Console на сообщения об успехе
  2. Если PatreonConfig был назначен: значения задаются автоматически
  3. Если PatreonConfig НЕ был назначен: скопируйте зашифрованные значения в PatreonConfig вручную
  4. Удалите GameObject - в сцене он больше не нужен

Настройка

Настройка Patreon

Перед настройкой плагина в Unity нужно подготовить приложение на Patreon:

  1. Станьте автором на Patreon:
    • Чтобы регистрировать OAuth-клиенты, нужно быть автором на Patreon
    • Перейдите в Patreon Developer Console
  2. Создайте OAuth-клиент:
    • Нажмите «Create Client» или «Register New Client»
    • Заполните данные приложения
    • ВАЖНО: укажите redirect URI: http://localhost:3000/patreon-callback
    • Он должен точно совпадать с redirect URI в PatreonConfig
  3. Получите учётные данные:
    • 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.oauth
  • https://yourdomain.com/api/oauth/redirect?scheme=awesomeapp.auth
  • https://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 для всех игр
  • Динамическая схема, своя для каждой игры
  • Простая настройка: меняется только схема
  • Автоматическое определение платформы

🔧 Использование:

  1. Выберите схему: mygame.oauth
  2. Настройки приложения Patreon: https://yourdomain.com/api/oauth/redirect?scheme=mygame.oauth
  3. Скопируйте файлы платформ и измените схему
  4. Укажите customUriScheme в Unity
  5. Проверьте! 🎯

👑 Настройка Creator API (необязательно)

Для расширенных функций — данных кампании, списков участников и сведений об уровнях:

Шаг 1: Получите Creator's Access Token

  1. Перейдите в Patreon Developer Console
  2. Создайте «Creator’s Access Token» (не OAuth Client)
  3. Выберите scopes: campaigns, campaigns.members, campaigns.tiers
  4. Скопируйте Access Token и Refresh Token

Шаг 2: Включите Creator API

  1. В скрипте PatreonEncryptCredentials:
    • ✅ Отметьте «Enable Creator API»
    • Введите Creator Access Token
    • Введите Creator Refresh Token
  2. Нажмите «Encrypt All Credentials»
  3. Значения автоматически запишутся в 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:

  1. Инициализируйте аутентификатор
  2. Запустите процесс входа
  3. Обработайте колбэк
  4. Проверьте токен

Вот простой пример:

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-поток Patreon
  • void Logout() - Выполняет выход текущего пользователя и очищает токены
  • void SetAccessToken(string token) - Устанавливает access token
  • void 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».

Решение:

  1. Проверьте Client ID в Patreon Developer Portal
  2. Убедитесь, что Client ID правильно введён в Project Settings Unity
  3. Убедитесь, что приложение правильно настроено на Patreon

Проблемы с обновлением токенов

Проблема: токены не обновляются автоматически.

Решение:

  1. Проверьте подключение к интернету
  2. Убедитесь, что Client Secret указан верно
  3. Убедитесь, что redirect URI совпадает в точности

Проблемы со сборками Unity

Проблема: плагин работает в редакторе, но не в сборках.

Решение:

  1. Убедитесь, что все нужные зависимости включены в сборку
  2. Проверьте, что настройка Patreon подготовлена для продакшена
  3. Убедитесь, что 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

  1. Создайте 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}");
// 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 в WebGL
  • Show Platform Info: вывод сведений о текущей платформе

Тестовые скрипты

  • PatreonCallbackManager: тесты по платформам
  • PatreonDeepLinkHandler: тесты deep link на мобильных
  • PatreonWebGLHandler: тесты middleware в WebGL
  • PatreonMobileTest: тесты совместимости с мобильными

Тестирование безопасности

Плагин содержит полноценную систему тестирования безопасности:

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}");

Поддержка

Получить помощь

Если возникли проблемы или вопросы:

  1. Загляните в документацию - здесь разобраны самые частые проблемы
  2. Присоединяйтесь к нашему сообществу в Discord - помогут другие разработчики и наша команда
  3. Напишите в поддержку - по техническим вопросам укажите:
    • Версию Unity
    • Версию плагина
    • Шаги для воспроизведения
    • Сообщения об ошибках
    • Файлы логов

Сообщество

Присоединяйтесь к сообществу за поддержкой и новостями:

Обновления

Следите за новыми функциями и исправлениями:

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

ВАЖНОЕ УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ

Плагин предоставляет шифрование 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 для разных типов аккаунтов
  • Решение: расширенное логирование и проверка (см. предупреждения в консоли)
  • Проблема: ссылки на YouTube, Twitter, Facebook пустые
  • Причина: ограниченный доступ к полям API для обычных пользователей
  • Решение: расширенные запросы полей в вызовах API

🔍 Отладочная информация

Теперь плагин ведёт подробный отладочный лог. Проверьте в Console Unity:

  • 🔧 === USER DATA DEBUG === - Полный анализ данных пользователя
  • 🔧 Email not available - Предупреждения об ограничениях scopes
  • 🔧 Normal user has tier_title - Несоответствия типов аккаунтов

📋 Чек-лист тестирования

При тестировании с разными типами аккаунтов:

  1. Тест с аккаунтом автора:
    • ✅ E-mail должен приходить
    • ✅ Фото профиля должно приходить
    • ✅ Данные об уровне должны быть верными
    • ✅ Ссылки на соцсети могут быть доступны
  2. Тест с аккаунтом обычного пользователя:
    • ⚠️ E-mail может быть недоступен (зависит от scope)
    • ✅ Фото профиля должно приходить (с запасным вариантом)
    • ⚠️ Данные об уровне могут быть неверными (пишется предупреждение)
    • ⚠️ Ссылки на соцсети могут быть недоступны

🛠️ Расширенные scopes OAuth

Теперь плагин запрашивает расширенные scopes:

identity identity[email] identity.memberships campaigns

Это даёт лучший доступ к данным пользователя при разных типах аккаунтов.

🔧 Проверка и исправление данных API

Важно: плагин проверяет данные на стороне клиента и исправляет известные несоответствия Patreon API V2. Это нужно, потому что:

  1. Ошибки в данных API: Patreon API V2 иногда возвращает неверные данные для обычных пользователей (например, уровень «Creator»)
  2. Противоречия в данных: API может возвращать противоречивые значения (например, patron_status: "not_patron", но is_patron: true)
  3. Смешение типов аккаунтов: в ответах API данные пользователя и автора иногда смешиваются
  4. Проблемы со статусом подписчика: поле 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!