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