ฉันตัดสินใจที่จะลองคิดสิ่งนี้ด้วยตัวเอง แม้ว่า OAuth2 รองรับการตรวจสอบสิทธิ์แบบไม่ใช้เบราว์เซอร์ แต่ Box.com ก็ได้ตัดสินใจที่จะไม่ใช้งาน (หรืออย่างน้อย ฉันก็ไม่พบวิธีดำเนินการใดๆ เลย)
ดังนั้น ทางเลือกเดียวสำหรับแอปพลิเคชันบนเดสก์ท็อปคือการสกัดกั้นการเปลี่ยนเส้นทาง URL ที่เกิดขึ้นและดึงข้อมูลการตรวจสอบสิทธิ์ออกจากพารามิเตอร์สตริงการสืบค้น
อย่างไรก็ตาม เนื่องจากเมื่อเร็วๆ นี้ IE ได้ล้าหลังไปมาก และฉันทำงานใน C# และ .NET ฉันจึงตัดสินใจพิจารณาการฝังเบราว์เซอร์อื่นแทนการใช้การควบคุมเบราว์เซอร์ในตัว ฉันเลือกใช้ Awesomium--a .NET ตัวห่อโครเมียม
ดังนั้น เพื่อเป็นการไม่ให้เสียเวลา ฉันขอนำเสนอตัวอย่างเปล่าๆ ที่จะใช้ได้กับแอปพลิเคชันบนเดสก์ท็อป
โซลูชันของฉันมีสองรูปแบบ รูปแบบหนึ่งที่ฉันใช้เป็นเพียง "เบราว์เซอร์" และรูปแบบหลัก: 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