Skip to content

Обсуждение авторизации #2

@qdimka

Description

@qdimka

@alkuramshina есть такое предложение по авторизации. Позволяет разделить сессии для разных сервисов (Глагол, Яндекс). Предлагаю обсудить и додумать.

       // Хранит куки
    public interface ISessionStorage
    {
        public CookieCollection Get();
        public void Save(CookieCollection cookie);
    }
    
    // Взаимодействует с ISessionStorage и апи яндекса. Подставляет куки
    public interface IYandexApiInvoker
    {
        Task<TOut> GetAsync<TIn, TOut>(Uri uri, TIn query, bool skipAuth, CancellationToken token);
        
        Task<TOut> PostAsync<TIn, TOut>(Uri uri, TIn request, bool skipAuth, CancellationToken token);
    }

    // Взаимодействует с IYandexApiInvoker и отвечает за авторизацию
    public interface IYandexSession
    {
        Task<bool> IsAuthorizedAsync();
        
        Task AuthorizeByLoginAsync(AuthByLoginRequest request);
    }

    // Расширяет функционал IYandexSession для получения токенов от Я.Музыки 
    public interface IGlagolSession
    {
        public Task<string> GetMusicTokenAsync();
    }
    
    
    public class SessionStorage : ISessionStorage
    {
        private readonly string _path;

        public SessionStorage(string path)
        {
            _path = path;
        }
        
        public CookieCollection Get()
        {
            return new CookieCollection();
        }

        public void Save(CookieCollection cookies)
        {
            throw new NotImplementedException();
        }
    }

    // Реализует IYandexApiInvoker, IYandexSession,
    // позволяет при запросах к апи яндекса рефрешить авторизацию, незаметно для пользователчя
    public class YandexApi : IYandexApiInvoker, IYandexSession
    {
        private readonly ISessionStorage _sessionStorage;
        
        private readonly HttpClientHandler _httpClientHandler;
        private readonly HttpClient _httpClient;

        public YandexApi(ISessionStorage sessionStorage)
        {
            _sessionStorage = sessionStorage;
            _httpClientHandler = new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new CookieContainer()
            };

            _httpClient = new HttpClient(_httpClientHandler);
        }
        
        public Task<TOut> GetAsync<TIn, TOut>(Uri uri, TIn query, bool skipAuth, CancellationToken token)
        {
            throw new NotImplementedException();
        }

        public Task<TOut> PostAsync<TIn, TOut>(Uri uri, TIn request, bool skipAuth, CancellationToken token)
        {
            throw new NotImplementedException();
        }

        public Task<bool> IsAuthorizedAsync()
        {
            throw new NotImplementedException();
        }

        public Task AuthorizeByLoginAsync(AuthByLoginRequest request)
        {
            throw new NotImplementedException();
        }

        private Task AuthorizeByXToken(string xToken)
        {
            throw new NotImplementedException();
        }
    }
    
    public class GlagolSession : IGlagolSession
    {
        private readonly IYandexApiInvoker _apiInvoker;

        public GlagolSession(IYandexApiInvoker apiInvoker)
        {
            _apiInvoker = apiInvoker;
        }
        
        public Task<string> GetMusicTokenAsync()
        {
            //return _apiInvoker.GetAsync<string>(url, params);
        }
    }

Metadata

Metadata

Assignees

Labels

questionFurther information is requested

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions