Otentikasi ke Box dalam aplikasi desktop C# menggunakan perpustakaan Box Windows SDK v2

Sepertinya ini adalah hal yang sederhana untuk dilakukan, tetapi saya tidak dapat menemukan contoh atau dokumentasi yang cukup menyeluruh untuk memahaminya.

Saya memiliki aplikasi desktop C# yang ingin saya integrasikan dengan Box melalui Box API. Saya berasumsi bahwa menggunakan Box Windows SDK v2 untuk .NET akan menjadi cara yang tepat.

Dapatkah seseorang mengarahkan saya ke contoh sederhana dan sederhana yang dapat digunakan untuk aplikasi desktop?


person jpreed00    schedule 02.03.2014    source sumber


Jawaban (2)


Saya memutuskan untuk mencoba dan mencari tahu sendiri. Meskipun OAuth2 mendukung otentikasi berbasis non-browser, rupanya Box.com telah memutuskan untuk tidak menerapkannya (atau, setidaknya, saya tidak menemukan cara melakukannya di mana pun).

Jadi, satu-satunya alternatif untuk aplikasi berbasis desktop adalah mencegat pengalihan URL yang terjadi dan mencabut informasi autentikasi dari parameter string kueri.

Namun, karena IE telah ketinggalan zaman akhir-akhir ini, dan saya bekerja di C# dan .NET, saya memutuskan untuk mempertimbangkan untuk menyematkan browser lain daripada menggunakan kontrol browser bawaan. Saya menggunakan Awesomium--a .NET yang dikelola pembungkus Chromium.

Jadi, tanpa basa-basi lagi, saya menyajikan contoh sederhana yang dapat digunakan untuk aplikasi desktop.

Solusi saya memiliki dua bentuk, satu yang saya gunakan murni sebagai "browser" dan bentuk utama: frmMain berisi semua kode dan frmBrowser berisi kontrol 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"]);
    }
  }
}

Kode di atas adalah tempat keajaiban terjadi. Peristiwa AddressChanged diaktifkan setiap kali URL yang ditampilkan oleh kontrol web berubah. Jadi, Anda harus menyetel URL pengalihan ke sesuatu yang unik yang dapat Anda deteksi--bahkan tidak harus ada, seperti yang ditunjukkan pada kode contoh. Kemudian Anda cukup mencabut parameter yang Anda perlukan dan melanjutkan proses otentikasi.

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");
}

Kode selanjutnya hanyalah kode autentikasi biasa yang menggunakan token dan yang lainnya dari permintaan sebelumnya untuk mendapatkan lebih banyak token, dll. Box menggunakan "refresh_tokens" untuk memungkinkan Anda mendapatkan token akses tambahan, saya tunjukkan contoh bagaimana melakukan itu juga.

Jika Anda melihat ada kesalahan atau memiliki komentar, dll. tinggalkan saja komentar.

person jpreed00    schedule 04.03.2014
comment
Saya telah mencoba posturl function Anda untuk mengambil JSon. Tapi saya mendapatkan kesalahan The remote server returned an error: (400) Bad Request.. butuh bantuan apa yang saya lewatkan di sini? - person RajeshKdev; 16.06.2014
comment
Saya telah mengautentikasi dan mendapatkan code dari default browser. - person RajeshKdev; 16.06.2014
comment
Yap Terima kasih banyak kawan. :) - person RajeshKdev; 17.06.2014

Pastikan Anda menggunakan Box SDK versi v2 resmi: https://github.com/box/box-windows-sdk-v2

Ada contoh lengkap WPF dalam solusi untuk membantu Anda memulai. Jika Anda menemukan pertanyaan lain, silakan tinggalkan postingan di bagian masalah di halaman github.

person letstango    schedule 02.03.2014
comment
Jadi, saya kira apa yang Anda katakan kepada saya adalah bahwa tidak ada cara untuk mengotorisasi terhadap Box tanpa menggunakan kontrol browser dan mencegat pengalihan setelah otorisasi diberikan atau dicabut? - person jpreed00; 02.03.2014
comment
Begitulah sifat OAuth 2. Permintaan otorisasi awal harus melalui box.com/api/ oauth2/otorisasi. Permintaan otorisasi selanjutnya dapat dilakukan menggunakan token penyegaran tanpa tampilan web. - person letstango; 03.03.2014
comment
Lalu, apakah mungkin untuk menampilkan layar otorisasi kepada pengguna, tunggu sekitar 15 detik, lalu, dengan asumsi pengguna memberi Anda akses, coba lakukan apa pun yang baru saja Anda katakan dengan token penyegaran? - person jpreed00; 03.03.2014