การรับรองความถูกต้องของ 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--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
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/อนุญาต. คำขอการให้สิทธิ์ครั้งต่อไปสามารถทำได้โดยใช้โทเค็นการรีเฟรชโดยไม่ต้องมี WebView - person letstango; 03.03.2014
comment
จากนั้น เป็นไปได้ไหมที่จะนำเสนอหน้าจอการอนุญาตแก่ผู้ใช้ รอประมาณ 15 วินาที จากนั้นสมมติว่าผู้ใช้ให้สิทธิ์การเข้าถึงแก่คุณ พยายามทำทุกอย่างที่คุณเพิ่งพูดด้วยโทเค็นการรีเฟรช - person jpreed00; 03.03.2014