Аутентификация в Box в настольном приложении C# с использованием библиотеки Box Windows SDK v2

Похоже, это должно быть просто, но я не могу найти пример или достаточно подробную документацию, чтобы понять это.

У меня есть настольное приложение C#, которое я хочу интегрировать с Box через Box API. Я предполагаю, что лучше всего использовать Box Windows SDK v2 для .NET.

Может ли кто-нибудь указать мне на простой пример, который будет работать для настольного приложения?


person jpreed00    schedule 02.03.2014    source источник


Ответы (2)


Я решил попробовать разобраться в этом сам. Несмотря на то, что OAuth2 поддерживает аутентификацию без браузера, очевидно, Box.com решил не реализовывать ее (или, по крайней мере, я нигде не могу найти упоминания о том, как это сделать).

Таким образом, единственная альтернатива для настольного приложения — каким-то образом перехватить происходящее перенаправление URL-адреса и извлечь информацию аутентификации из параметров строки запроса.

Однако, поскольку IE в последнее время отстал от времени, а я работаю с C# и .NET, я решил изучить возможность встраивания другого браузера, а не использовать встроенный элемент управления браузера. Я выбрал Awesomium — управляемую .NET оболочка Chromium.

Итак, без лишних слов, я представляю простой пример, который будет работать для настольного приложения.

Мое решение имеет две формы: одну, которую я использую исключительно как «браузер», и основную форму: frmMain содержит весь код, а frmBrowser содержит элемент управления Awesomium.

using Newtonsoft.Json.Linq;
using System.Web;

private static frmBrowser browser = null;
private const string BoxClientId = "{your client id}";
private const string BoxSecret = "{your secret}";    

private void authenticateWithBox()
{
   browser = new frmBrowser();
   browser.Show();

   browser.webControl1.Source = new Uri("https://www.box.com/api/oauth2/authorize?response_type=code&client_id=" + BoxClientId + "&redirect_uri=https://localsess");
   browser.webControl1.AddressChanged += new Awesomium.Core.UrlEventHandler(webControl1_AddressChanged);
}

void webControl1_AddressChanged(object sender, Awesomium.Core.UrlEventArgs e)
{
  //MessageBox.Show(e.Url.ToString());
  if (e.Url.Host == "localsess")
  {
    NameValueCollection parms = HttpUtility.ParseQueryString(e.Url.Query);
    if (parms.AllKeys.Contains("error"))
    {
       MessageBox.Show("Error connecting to Box.com: " + parms["error"] + " " + parms["error_description"]);
    }
    else
    {
        boxContinue(parms["code"]);
    }
  }
}

В приведенном выше коде происходит волшебство. Событие AddressChanged запускается каждый раз, когда URL-адрес, отображаемый веб-элементом управления, изменяется. Таким образом, вы должны установить свой URL-адрес перенаправления на что-то уникальное, что вы можете обнаружить — оно даже не должно существовать, как показано в примере кода. Затем вы можете просто выдернуть нужные вам параметры и продолжить процесс аутентификации.

string postToUrl(string url, string data)
{
  string results = String.Empty;
  WebRequest req = WebRequest.Create(url);
  req.Method = WebRequestMethods.Http.Post;
  byte[] byteArray = Encoding.UTF8.GetBytes(data);
  req.ContentType = "application/x-www-form-urlencoded";
  req.ContentLength = byteArray.Length;
  Stream dataStream = req.GetRequestStream();
  dataStream.Write(byteArray, 0, byteArray.Length);
  dataStream.Close();
  WebResponse res = req.GetResponse();
  dataStream = res.GetResponseStream();
  StreamReader reader = new StreamReader(dataStream);
  results = reader.ReadToEnd();
  return results;
}

void boxContinue(string code)
{
  browser.Close();
  browser.Dispose();
  string json = postToUrl("https://www.box.com/api/oauth2/token", "code=" + code + "&grant_type=authorization_code&client_id=" + BoxClientId + "&client_secret=" + BoxSecret);
  JToken token = JObject.Parse(json);

  string access_token = (string)token.SelectToken("access_token");
  string refresh_token = (string)token.SelectToken("refresh_token");
}

void boxRefresh(string refresh_token)
{
  string json = postToUrl("https://www.box.com/api/oauth2/token", "grant_type=refresh_token&refresh_token=" + refresh_token + "&client_id=" + BoxClientId + "&client_secret=" + BoxSecret);
  JToken token = JObject.Parse(json);

  string access_token = (string)token.SelectToken("access_token");
  string new_refresh_token = (string)token.SelectToken("refresh_token");
}

Остальная часть кода — это просто ваш заурядный код аутентификации, который использует токены и еще что-то из предыдущих запросов, чтобы получить больше токенов и т. д. Box использует «refresh_tokens», чтобы вы могли получить дополнительные токены доступа, я показываю пример того, как это сделать тоже.

Если вы заметили какие-либо ошибки или у вас есть комментарии и т. д., просто оставьте комментарий.

person jpreed00    schedule 04.03.2014
comment
Я попытался с помощью posturl function восстановить файл JSon. Но я получаю ошибку The remote server returned an error: (400) Bad Request.. нужна помощь, что мне здесь не хватает? - person RajeshKdev; 16.06.2014
comment
Я прошел аутентификацию и получил code от default browser. - person RajeshKdev; 16.06.2014
comment
Яп Спасибо большое чувак. :) - person RajeshKdev; 17.06.2014

Убедитесь, что вы используете официальную версию Box SDK v2: https://github.com/box/box-windows-sdk-v2

В решении есть полный пример WPF, который поможет вам начать работу. Если у вас возникнут другие вопросы, не стесняйтесь оставлять сообщения в разделе проблем на странице github.

person letstango    schedule 02.03.2014
comment
Итак, я предполагаю, что вы говорите мне, что нет способа авторизоваться в Box без использования элемента управления браузера и перехвата перенаправления после того, как авторизация была либо предоставлена, либо отозвана? - person jpreed00; 02.03.2014
comment
Такова природа OAuth 2. Первоначальный запрос на авторизацию должен пройти через box.com/api/ oauth2/авторизовать. Последующие запросы на авторизацию можно выполнять с помощью токенов обновления без веб-просмотра. - person letstango; 03.03.2014
comment
Тогда можно ли представить пользователю экран авторизации, подождать около 15 секунд, а затем, предполагая, что пользователь предоставил вам доступ, попытаться сделать то, что вы только что сказали, с токенами обновления? - person jpreed00; 03.03.2014