Представлен новый выпуск Nemiro.OAuth.
Версия v1.12 включает обновления API поставщиков, а также содержит общие улучшения и доработки.
Рекомендуется выполнить обновление до версии v1.12.
PM> Install-Package Nemiro.OAuth
--------------------------------------------------------------------------------------------------
Напомню, библиотека Nemiro.OAuth предназначена для реализации в проектах ASP.NET и Windows Forms авторизации пользователей по протоколу OAuth и получение базовый информации из профилей пользователей (имя, пол, дата рождения, email, номер телефона, ссылка на сайт и фотографию пользователя). Библиотека содержит двадцать готовых к использованию клиентов для популярных ресурсов. Исходный код библиотеки открыт и поставляется на условиях лицензии Apache License Version 2.0.
--------------------------------------------------------------------------------------------------
Я особо не спешил с выпуском v1.12 и сделал две промежуточные бета-версии.
Для клиента Facebook обновлена версия Graph API до v2.7. Ранее в библиотеке использовалась версия v2.2. Как выяснилось, для новых приложений, Facebook насильно устанавливает последнюю версию Graph API (сейчас это v2.7), игнорируя версию, указанную в конечной точке (URL). В Graph API v2.4 был изменен порядок получения email пользователей и для новых приложений адрес электронной почты попросту не возвращался. Ко мне поступали сообщения об этой проблеме, но повторить её мне не удавалось, поскольку для моего старого приложения использовалась старая версия Graph API. Так что я списывал эту проблему на ошибки в настройках приложений со стороны пользователей, либо ограничения со стороны Facebook и все были счастливы. Так продолжалось до тех пор, пока не явился избранный, который смог доказать реальность существования проблемы 😊
Плановому обновлению подвергся клиент Dropbox, который теперь использует API v2.0.
Первая версия API будет отключена 28 июня 2017 года. Если вы разрабатываете приложения для Dropbox, то лучше начинать обновляться прямо сейчас. Завтра Новый год, потом лето и будет не до этого 😉 Я обновил примеры работы с Dropbox, возможно они вам помогут мигрировать на новую версию API. Примеры можно найти в GitHub.
https://github.com/alekseynemiro/nemiro.oauth.dll/tree/master/examples
В клиенте для Вконтакте теперь используется API v5.53 (фиксировано) и исправлена проблема с получением идентификатора пользователя.
Также были обновлены конечные точки у клиентов Google, LinkedIn и Odnoklassniki. Это не существенно, но лишним не будет.
Из серьёзных внутренних изменений, в начало перечисления HttpParameterType добавлен новый элемент – None. Индексация предыдущих элементов сместилась вниз. Это может быть критично для тех, кто работает непосредственно с внутренним кодом Nemiro.OAuth. Скорее всего таковых будет мало, если не ноль, так что проблем вызвать не должно.
Метод HttpParameterCollection.ToRequestBody() был мягко помечен как устаревший в v1.11, теперь отметка жесткая и будет приводить к ошибке. Это тоже экзотическое изменение, которое скорее всего никого не затронет.
Вспомогательные методы работы с веб-запросами теперь понимают тип содержимого JSON и XML и умеют автоматически сериализовать параметры запроса в нужный формат. Так что теперь достаточно просто добавить экземпляр объекта в качестве параметра запроса и указать тип содержимого (Content-Type), примерно так, как это показано в ниже следующем примере.
--------------------------------------------------------------------------------------------------
OAuthUtility.PostAsync
(
"https://api.dropboxapi.com/2/files/list_folder",
parameters: new HttpParameterCollection
{
new
{
path = "/",
include_media_info = True
}
},
contentType: "application/json",
authorization: "Bearer 123",
callback: UpdateList_Result
);
--------------------------------------------------------------------------------------------------
Еще одним улучшением стала возможность переопределять HTTP заголовки: Accept, Connection, Expect, Transfer-Encoding и User-Agent. Возможно кому-то пригодится 😊
Из долгожданных мелочей, я наконец-таки добавил возможность создавать собственных поставщиков запросов авторизации. Еще примерно в районе версии v1.8 один из пользователей предлагал это сделать, точнее даже сделал, но я отверг 😊 Каждый запрос на авторизацию хранится в памяти, в статичной коллекции. После завершения процедуры авторизации, запрос удаляется. Это примерно, как Session, если смотреть с позиции веб-приложения. В большинстве случаев такой подход оптимален. Однако, если приложение завершит свой жизненный цикл в процессе авторизации пользователя, то сессия будет утрачена и пользователю придется проходить авторизацию повторно. Не критично. А вот если для работы приложения используются несколько рабочих процессов или серверов, то проблема становится существенней, поскольку наверняка возникнут проблемы с поиском сессии, точнее её просто невозможно будет найти, и пользователь не сможет авторизоваться. Это одна из очевидных вещей, которую нужно было сделать изначально, но всего один запрос - не самый мотивирующий повод заниматься этим 😊 И вот, теперь можно сделать собственного поставщика запросов и, например, хранить сессии в базе данных, или в файловой системе.
В качестве примера я сделал класс для хранения сессий в MemoryCache. Не самое надежное решение для ASP.NET, но для понимания принципа работы этого достаточно.
https://github.com/alekseynemiro/nemiro.oauth.dll/blob/master/examples/AspNetCustomRequestsProvider/MemCacheOAuthRequestsProvider.cs
Еще одной доработкой стала возможность сохранять в запрос на авторизацию пользовательские параметры. Это актуально только для веб-проектов. В протоколе OAuth для этого используется параметр state, но я его в наглую занял для передачи идентификатора сессии и пользователь (программист) не имеет к нему доступа. Это не является проблемой, поскольку программист может использовать обычную сессию (Session) для сохранения любых дополнительных данных. Но практика показывает, что не все помнят о Session или же не рассматривают возможность её использования для решения этой проблемы. Теперь можно передавать пользовательские параметры при создании запроса на авторизацию или перенаправлении на страницу авторизации.
--------------------------------------------------------------------------------------------------
OAuthWeb.RedirectToAuthorization
(
"google",
"http://example.org/externalloginresult.aspx",
new
{
text = "custom state",
text2 = "любые параметры с любыми типами данных",
aaa = 123,
bbb = "abc"
}
);
--------------------------------------------------------------------------------------------------
Традиционно была выпущена новая версия Nemiro.OAuth.LoginForms.
PM> Install-Package Nemiro.OAuth.LoginForms
В версии v1.5 добавлена возможность получать данные профиля пользователя. В предыдущих версиях запрос на получение данных профиля не делался, поскольку в приложениях Windows Forms и так подразумевается работа с API, так что делать лишние запросы не к чему. В отличие от веб-приложений, которые могут использовать только авторизацию и получение данных пользователя является обязательным.
Указать на необходимость получения подробной информации о пользователе можно при создании экземпляра формы, передав в конструктор параметр loadUserInfo. На выходе, найти данные профиля можно в свойстве формы UserInfo.
--------------------------------------------------------------------------------------------------
https://github.com/alekseynemiro/nemiro.oauth.dll
https://github.com/alekseynemiro/Nemiro.OAuth.LoginForms