OAuth клиент для C# (.NET): реализация авторизации через сторонние сервисы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека OAuth клиент для C# (.NET): реализация безопасной авторизации

В современной веб-разработке интеграция с внешними сервисами (Google, GitHub, Facebook и др.) через протокол OAuth 2.0 стала стандартом де-факто. Для платформы .NET существует несколько зрелых решений, но одним из наиболее гибких и производительных является библиотека OAuth клиент для C# (.NET), доступная через NuGet пакет OAuthClient.Net. Эта библиотека предоставляет разработчикам полный набор инструментов для реализации Authorization Code Flow, Implicit Grant и Client Credentials Flow.

Основные возможности библиотеки

  • Поддержка всех популярных провайдеров OAuth 2.0 — Google, GitHub, Microsoft, Facebook, VK, Яндекс и кастомные серверы.
  • Автоматическое управление токенами — получение Access Token, Refresh Token, автоматическое обновление при истечении срока действия.
  • Встроенная защита от CSRF-атак — генерация и проверка state-параметров.
  • Асинхронная работа — все методы поддерживают async/await.
  • Гибкая конфигурация — настройка через код или JSON-файл.
  • Расширяемость — возможность добавлять собственные провайдеры через интерфейсы.

Установка и подключение

Установка производится через NuGet Package Manager:

Install-Package OAuthClient.Net -Version 2.1.0

Или через .NET CLI:

dotnet add package OAuthClient.Net --version 2.1.0

После установки необходимо импортировать пространство имен:

using OAuthClient;
using OAuthClient.Models;
using OAuthClient.Providers;

Базовый пример: авторизация через Google

Рассмотрим простейший сценарий — получение данных пользователя из Google после успешной авторизации.

public async Task<UserInfo> AuthenticateWithGoogleAsync()
{
    // Настройка провайдера
    var googleProvider = new GoogleOAuthProvider(
        clientId: "YOUR_GOOGLE_CLIENT_ID",
        clientSecret: "YOUR_GOOGLE_CLIENT_SECRET",
        redirectUri: "https://yourapp.com/oauth/callback"
    );

    // Создание клиента
    var oauthClient = new OAuthClient(googleProvider);

    // Генерация URL для редиректа пользователя
    string authUrl = oauthClient.GetAuthorizationUrl(
        scope: new[] { "openid", "profile", "email" },
        state: Guid.NewGuid().ToString()
    );

    // После того как пользователь вернулся на callback URL:
    // Извлекаем код из query-параметра "code"
    string authorizationCode = HttpContext.Request.Query["code"];

    // Обмен кода на токен
    var tokenResponse = await oauthClient.ExchangeCodeForTokenAsync(authorizationCode);

    // Получение информации о пользователе
    var userInfo = await oauthClient.GetUserInfoAsync(tokenResponse.AccessToken);

    return userInfo;
}

Работа с Refresh Token

Для долгоживущих сессий библиотека автоматически управляет обновлением токенов. Пример сохранения и восстановления сессии:

// Сохранение Refresh Token после первой авторизации
string refreshToken = tokenResponse.RefreshToken;
// Сохраните его в БД или защищённом хранилище

// Восстановление сессии: получение нового Access Token
var newTokenResponse = await oauthClient.RefreshAccessTokenAsync(refreshToken);

// Автоматическое обновление (встроенная логика)
oauthClient.TokenRefreshed += (sender, args) =>
{
    // Логируем или сохраняем новый Refresh Token
    Console.WriteLine($"Новый Refresh Token: {args.NewRefreshToken}");
};

Кастомный провайдер OAuth

Если необходимо подключиться к сервису, которого нет в списке встроенных провайдеров, библиотека позволяет создать собственный:

public class CustomProvider : IOAuthProvider
{
    public string AuthorizationEndpoint => "https://customservice.com/oauth/authorize";
    public string TokenEndpoint => "https://customservice.com/oauth/token";
    public string UserInfoEndpoint => "https://customservice.com/oauth/userinfo";
    
    public string ClientId { get; }
    public string ClientSecret { get; }
    public string RedirectUri { get; }

    public CustomProvider(string clientId, string clientSecret, string redirectUri)
    {
        ClientId = clientId;
        ClientSecret = clientSecret;
        RedirectUri = redirectUri;
    }
}

// Использование:
var customProvider = new CustomProvider("id", "secret", "redirect");
var client = new OAuthClient(customProvider);

Обработка ошибок и безопасность

Библиотека предоставляет детализированные исключения для различных сценариев ошибок:

try
{
    var token = await oauthClient.ExchangeCodeForTokenAsync(code);
}
catch (OAuthException ex) when (ex.Error                    

Рекомендаций