Полный рефакторинг api. Вынесено отдельно api passport
This commit is contained in:
111
YandexMusic.API/API/YAuthAPI.cs
Normal file
111
YandexMusic.API/API/YAuthAPI.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using System.Security.Authentication;
|
||||
using YandexMusic.API.Models.Account;
|
||||
using YandexMusic.API.Requests.Account;
|
||||
|
||||
namespace YandexMusic.API;
|
||||
|
||||
/// <summary>API для работы с пользователем и авторизации.</summary>
|
||||
public class YAuthAPI : YCommonAPI
|
||||
{
|
||||
public YAuthAPI(YandexMusicApi api) : base(api) { }
|
||||
|
||||
/// <summary>Авторизация по готовому музыкальному токену (OAuth).</summary>
|
||||
public async Task AuthorizeAsync(string musicToken)
|
||||
{
|
||||
if (string.IsNullOrEmpty(musicToken))
|
||||
throw new ArgumentException("Токен не может быть пустым", nameof(musicToken));
|
||||
|
||||
Api.Storage.Token = musicToken;
|
||||
var authInfo = await new YGetAuthInfoBuilder(Api).ExecuteAsync(null!);
|
||||
if (authInfo?.Account?.Uid == null)
|
||||
throw new Exception("Пользователь не авторизован");
|
||||
|
||||
Api.Storage.SetAuthorized(authInfo.Account, musicToken);
|
||||
}
|
||||
|
||||
/// <summary>Авторизация по паспортному токену (полученному, например, после QR-входа).</summary>
|
||||
public async Task AuthorizeByPassportTokenAsync(string passportToken)
|
||||
{
|
||||
if (string.IsNullOrEmpty(passportToken))
|
||||
throw new ArgumentException("Паспортный токен не может быть пустым", nameof(passportToken));
|
||||
|
||||
var musicToken = await Api.Passport.GetMusicTokenByPassportTokenAsync(passportToken);
|
||||
if (musicToken?.AccessToken == null)
|
||||
throw new Exception("Не удалось обменять паспортный токен на музыкальный");
|
||||
|
||||
await AuthorizeAsync(musicToken.AccessToken);
|
||||
}
|
||||
|
||||
/// <summary>Получение информации о текущем аккаунте.</summary>
|
||||
public Task<YAccountResult?> GetUserAuthAsync()
|
||||
=> new YGetAuthInfoBuilder(Api).ExecuteAsync(null!);
|
||||
|
||||
/// <summary>Создание сессии авторизации (получение доступных методов входа).</summary>
|
||||
public async Task<YAuthTypes?> CreateAuthSessionAsync(string userName)
|
||||
{
|
||||
if (!await Api.Passport.GetCsrfTokenAsync()) // вместо InitSessionAsync
|
||||
throw new Exception("Не удалось инициализировать сессию");
|
||||
|
||||
var result = await new YGetAuthLoginUserBuilder(Api).ExecuteAsync((Api.Storage.AuthToken.CsfrToken, userName));
|
||||
if (result?.TrackId != null)
|
||||
Api.Storage.AuthToken.TrackId = result.TrackId;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>Получение капчи.</summary>
|
||||
public Task<YAuthCaptcha?> GetCaptchaAsync()
|
||||
{
|
||||
if (Api.Storage.AuthToken == null)
|
||||
throw new AuthenticationException("Выполните CreateAuthSessionAsync перед использованием");
|
||||
return new YGetAuthCaptchaBuilder(Api).ExecuteAsync(null!);
|
||||
}
|
||||
|
||||
/// <summary>Авторизация по капче.</summary>
|
||||
public Task<YAuthBase?> AuthorizeByCaptchaAsync(string captchaValue)
|
||||
{
|
||||
if (Api.Storage.AuthToken == null)
|
||||
throw new AuthenticationException("Выполните CreateAuthSessionAsync перед использованием");
|
||||
return new YGetAuthLoginCaptchaBuilder(Api).ExecuteAsync(captchaValue);
|
||||
}
|
||||
|
||||
/// <summary>Отправить письмо для авторизации.</summary>
|
||||
public Task<YAuthLetter?> GetAuthLetterAsync()
|
||||
=> new YGetAuthLetterBuilder(Api).ExecuteAsync(null!);
|
||||
|
||||
/// <summary>Подтверждение входа по письму и получение музыкального токена.</summary>
|
||||
public async Task<bool> AuthorizeByLetterAsync()
|
||||
{
|
||||
var status = await new YGetAuthLoginLetterBuilder(Api).ExecuteAsync(null!);
|
||||
if (status?.Status != YAuthStatus.Ok || !status.MagicLinkConfirmed)
|
||||
throw new Exception("Письмо не подтверждено");
|
||||
|
||||
var musicToken = await Api.Passport.GetMusicTokenByCookiesAsync();
|
||||
if (musicToken?.AccessToken == null)
|
||||
throw new Exception("Не удалось получить музыкальный токен после подтверждения письма");
|
||||
|
||||
await AuthorizeAsync(musicToken.AccessToken);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>Авторизация по паролю приложения Яндекс.</summary>
|
||||
public async Task<YAuthBase?> AuthorizeByAppPasswordAsync(string password)
|
||||
{
|
||||
if (Api.Storage.AuthToken == null)
|
||||
throw new AuthenticationException("Выполните CreateAuthSessionAsync перед использованием");
|
||||
|
||||
var result = await new YGetAuthAppPasswordBuilder(Api).ExecuteAsync(password);
|
||||
if (result?.Status != YAuthStatus.Ok)
|
||||
throw new AuthenticationException("Ошибка авторизации по паролю");
|
||||
|
||||
var musicToken = await Api.Passport.GetMusicTokenByCookiesAsync();
|
||||
if (musicToken?.AccessToken == null)
|
||||
throw new Exception("Не удалось получить музыкальный токен после ввода пароля");
|
||||
|
||||
await AuthorizeAsync(musicToken.AccessToken);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>Получение информации о пользователе через логин.</summary>
|
||||
public Task<YLoginInfo?> GetLoginInfoAsync()
|
||||
=> new YGetLoginInfoBuilder(Api).ExecuteAsync(null!);
|
||||
}
|
||||
Reference in New Issue
Block a user