@ydusanyuk
I'm enjoying programming

Как с dll запустить диалоговое окно с браузером и получить результат?

Здравствуйте.

Мне нужно получить access token для vk.com через OAuth. Как из библиотеки классов можно запустить браузер по умолчанию с нужной страницой (https://oauth.vk.com/authorize...), и получить из него сам токен?
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Слишком общий вопрос :-)

Манипулирование живым браузером - плохая идея, это ненадежно и можно споткнуться на всяких антивирусах. На уровне приложения лучше использовать компонент WebBrowser (по сути - Internet Explorer) или альтернативу (это будет минимум мегабайт 20-40 к размеру программы).

Давным-давно писал статейку по работе с ВКонтакте, не знаю насколько сейчас актуальна и работает ли:
Разработка desktop-приложения для «ВКонтакте» на C#

Есть также библиотека с открытым исходным кодом:
https://github.com/alekseynemiro/nemiro.oauth.dll

Попробуйте выдернуть клиент для ВКонтакте (включая зависимости) или внедрить целиком, если не устроит присутствие лишней библиотеки в проекте (даже двух, если используется Windows Forms) :-)

Готовые формы для Windows Forms:
https://github.com/alekseynemiro/Nemiro.OAuth.Logi...

Статья по использованию библиотеки: Авторизация по протоколу OAuth в проектах .NET Fra...

Демонстрация ASP.NET MVC: demo-oauth.nemiro.net

Получение адреса для авторизации делается примерно так:

string applicationId = "идентификатор вашего приложения";
string scope = "status,email";
string authorizeUrl = "https://oauth.vk.com/authorize";
authorizeUrl += String.Format("?client_id={0}&response_type=code", applicationId);
// authorizeUrl += String.Format("&state={0}", "все что вам нужно");
authorizeUrl += String.Format("&scope={0}", scope);

Адрес authorizeUrl можно открыть в WebBrowser: webBrowser1.Navigate(authorizeUrl). В обработчике события DocumentCompleted можно получать код авторизации или маркер доступа (смотря какой response_type используется).

На примере обработчика по умолчанию из моей библиотеки:

protected internal void DefaultCallback(object sender, WebBrowserCallbackEventArgs e)
{
  // ожидаем, когда будет получен результат
  if (e.Url.Query.IndexOf("code=") != -1 || e.Url.Query.IndexOf("oauth_verifier=") != -1)
  {
    // результат получен, извлекаем код авторизации
    // из строка параметров запроса
    // e.Url.Query // <= строка параметров запроса
    // либо oauth_verifier, либо code - точно уже не помню
  }
}

Но вообще, все может быть чуть сложнее. Нужно учитывать версию IE и, в идеале, использовать самую свежую (см. SetIEVersion). Вероятность появления ошибок в клиентском коде и адекватная реакция на них. Всех подводных камней сейчас и не припомню.

Если response_type=code, как в указанном выше коде получения адрес авторизации, то конвертировать код авторизации в маркер доступа можно выполнив запрос (скорее всего POST) к странице https://oauth.vk.com/access_token, на которую нужно передать следующие параметры:

code=полученный код
client_id=идентификатор приложения
client_secret=секретный ключ
grant_type=authorization_code

Запрос маркера доступа нужно делать без WebBrowser, а например, с помощью WebClient или HttpClient.
Если все правильно, сервер вернет access_token.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы