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

    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.
    Ответ написан
    Комментировать
  • Почему добавленные элементы в массив не отображаются (angularJs + ajax)?

    Проблема в том, что ангуляр не в курсе, какие асинхронные операции вы вытворяете и его нужно оповещать в таких случаях. Поэтому рекомендуется использовать сервисы предоставленные ангуляром, в данном случае $http или $resource. То же самое касается $timeout, директив для бинда DOM эвентов(ng-click например). Если какой-то сторонний метод возвращает ES Promise - то стоит обернуть его в $q.when().
    Ответ написан
    1 комментарий