Библиотека 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