แม้ว่าแพลตฟอร์ม Sina Weibo Open ให้การดาวน์โหลดการดาวน์โหลด SDK ในภาษาต่างๆ อย่างไรก็ตามหลังจากพยายามอย่างอดทนในทุกวันนี้ฉันรู้สึกว่าคำแนะนำการแนะนำเกี่ยวกับแพลตฟอร์มเปิดของ Sina Weibo นั้นค่อนข้างไม่สอดคล้องกับคำอธิบายประกอบการใช้ตัวอย่างในแพ็คเกจการพัฒนา Java Weibo4J ที่ดาวน์โหลดมา นอกจากนี้ความสามารถในการทำความเข้าใจของฉันเองนั้นมี จำกัด ซึ่งนำไปสู่ปัญหาที่ไม่เด่นหลายประการ โชคดีที่ฉันไม่ยอมแพ้ที่จะเข้าใจ เรื่องไร้สาระน้อยลงต่อไปนี้เป็นกระบวนการเรียนรู้ของฉัน
หากคุณต้องการพัฒนาแอปพลิเคชัน Weibo ของคุณเองโดยเรียก Sina Weibo Open Platform API ขั้นตอนแรกคือการมีบัญชี Sina Weibo และบัญชี CSDN เนื่องจากเราจำเป็นต้องใช้บัญชีสองบัญชีนี้เพื่อสร้างแอปพลิเคชัน Weibo ในเวลาเดียวกัน ดังนั้นการใช้คีย์แอพและคีย์ลับคืออะไร?
อันที่จริงฉันเพิ่งอ่านคำอธิบายหลายชุดบนแพลตฟอร์มเปิดของ Sina Weibo แต่ฉันไม่เข้าใจว่าคีย์แอพและคีย์ลับมีประโยชน์อย่างไร เพราะสิ่งที่สำคัญกว่าคือการเข้าใจกระบวนการทั้งหมดของการรับรองความถูกต้องของ OAuth และการอนุญาตรวมถึงบทบาทของโทเค็นหลายตัวและ URL 4 URL ในการตรวจสอบความถูกต้องของ OAuth และกระบวนการอนุญาต
เมื่อฉันพบ Oauth ครั้งแรกซึ่งไม่มีความคิดฉันคิดว่าฉันจะไม่สามารถเรียนรู้ต่อไปได้ โชคดีที่ฉันพบบทความต่อไปนี้ซึ่งมีประโยชน์มากสำหรับการทำความเข้าใจ Oauth ลิงค์มีดังนี้:
มีผู้เข้าร่วม 3 คนใน OAuth คือผู้ใช้ผู้ให้บริการและผู้บริโภค สมมติว่าฉันต้องการพัฒนาแอปพลิเคชัน (แอป) ตามแพลตฟอร์ม Open Sina Weibo สำหรับผู้ใช้ Sina Weibo รายอื่นที่จะใช้ การติดต่อของพวกเขามีดังนี้:
ในความเป็นจริงแอปของเราเทียบเท่ากับแอปพลิเคชันบุคคลที่สามสำหรับผู้ใช้และผู้ให้บริการ (แพลตฟอร์ม Sina Weibo) ในฐานะแอพของบุคคลที่สามหากคุณต้องการเข้าถึงทรัพยากรที่ผู้ใช้บันทึกไว้บนแพลตฟอร์ม Sina Weibo คุณต้องได้รับการรับรองความถูกต้องและการอนุญาตก่อนที่จะสามารถทำงานได้
ต่อไปนี้เป็นแผนภาพตามความเข้าใจของฉันเกี่ยวกับการตรวจสอบความถูกต้องของ OAuth ทั้งหมดและกระบวนการอนุญาต (คุณสามารถดูและข้ามไปได้หลังจากที่คุณมีความเข้าใจบางอย่างเกี่ยวกับแนวคิดบางอย่างด้านล่างคุณจะมองย้อนกลับไปที่แผนภูมิโฟลว์นี้):
การรวมผังงานด้านบนนี่คือความเข้าใจของฉันเกี่ยวกับข้อกำหนดและคำอธิบายของแต่ละกระบวนการ:
คีย์ผู้บริโภคและความลับของผู้บริโภค: แพลตฟอร์มเปิดบน Sina Weibo เรียกว่า App Key และ Secret Key ตามลำดับ ผู้บริโภคใช้กับผู้ให้บริการเพื่อให้สามารถเรียก API แบบเปิดได้ หลังจากได้รับการอนุมัติแอปพลิเคชันผู้ให้บริการจะได้รับมอบหมายให้ผู้บริโภคที่ตรงตามข้อกำหนดซึ่งใช้เพื่อระบุว่าผู้บริโภคตรงตามข้อกำหนดของผู้ให้บริการ
สอดคล้องกับการไหล 1 และ 2 ในรูปด้านบน
โทเค็นคำขอขอความลับ: เมื่อผู้ใช้เข้าถึงผู้บริโภคและต้องการรับบริการพิเศษบริการจะถูกส่งคืนโดยผู้บริโภคหลังจากรวมทรัพยากรที่เก็บไว้ในผู้ใช้เอง ในเวลานี้ผู้บริโภคขอให้ผู้ให้บริการรับโทเค็นคำขอซึ่งใช้เพื่อระบุความสัมพันธ์เฉพาะระหว่างผู้บริโภคและผู้ใช้โดยเฉพาะ
สอดคล้องกับการไหล 3, 4 และ 5 ในรูปด้านบน
ในการดำเนินการ 6 ผู้บริโภคจะต้องนำผู้ใช้ไปยังหน้าตรวจสอบความถูกต้องของ OAuth และการอนุมัติโดยผู้ให้บริการ ในความเป็นจริงเบราว์เซอร์เปลี่ยนเส้นทางไปยัง AuthenticationURL ด้วยโทเค็นคำขอและขอพารามิเตอร์ลับที่แนบมา URL นี้จัดทำโดยผู้ให้บริการ
ถัดไปในกระบวนการ 7 และ 8 ผู้ใช้อนุญาตให้ผู้บริโภค (โดยปกติจะเข้าสู่ระบบโดยป้อนบัญชีและรหัสผ่าน) ผู้ให้บริการจะเปลี่ยนเส้นทางไปยังการโทรกลับ _url ที่ผู้บริโภคจัดหาให้ในกระบวนการ 1
กระบวนการ 9 เป็นผู้บริโภคที่ขอให้ผู้ให้บริการอีกครั้งเพื่อรับโทเค็นการเข้าถึงผ่านโทเค็นคำขอที่ได้รับจากผู้ให้บริการมาก่อน
โทเค็นการเข้าถึงการเข้าถึงความลับ: หากผู้ให้บริการส่งคืนโทเค็นการเข้าถึงโดยไม่ได้รับอนุญาตจากผู้ใช้ในกระบวนการ 10 จะใช้เพื่อระบุทรัพยากรและข้อมูลที่เก็บไว้ในผู้ให้บริการของผู้บริโภคบางรายโดยเฉพาะ จากนั้นผู้บริโภคสามารถเริ่มใช้โทเค็นการเข้าถึงที่ได้รับและการเข้าถึงความลับเพื่อเข้าถึงทรัพยากรที่เก็บไว้ในผู้ให้บริการโดยผู้ใช้ที่เกี่ยวข้อง
หลังจากรวมและดำเนินการข้อมูลผู้ใช้ในกระบวนการ 11 ผลลัพธ์บริการเฉพาะสามารถส่งคืนไปยังผู้ใช้
ด้วยความเข้าใจข้างต้นเกี่ยวกับกระบวนการ OAUTH เรารู้ว่าผู้ใช้ไม่ได้รั่วไหลออกจากบัญชีรหัสผ่าน ฯลฯ ที่จำเป็นในการเข้าสู่ระบบไปยังผู้ให้บริการไปยังผู้บริโภคบุคคลที่สาม ในเวลาเดียวกันผู้ใช้สามารถใช้บริการพิเศษของผู้บริโภค ช่างเป็นกระบวนการปฏิบัติการที่ฉลาดและปลอดภัย!
นอกจากนี้ในรูปด้านบนผู้บริโภคได้ทำการร้องขอที่แตกต่างจากผู้ให้บริการ ในความเป็นจริงผู้ให้บริการให้ URL 3 รายการที่มีฟังก์ชั่นที่แตกต่างกันในการเข้าถึงผู้บริโภค ภาพหน้าจอของ URL ทั้ง 3 แห่งในแพลตฟอร์ม Open Sina Weibo มีดังนี้:
ใช้การตรวจสอบ OAuth และโพสต์บนแพลตฟอร์ม Open Sina Weibo
ในการใช้ API ของแพลตฟอร์ม Open Sina Weibo คุณควรได้รับคีย์แอพและแอปลับที่ได้รับมอบหมายจาก SINA ด้านล่างนี้เป็นคีย์แอพและความลับของแอปที่ได้รับมอบหมายจาก SINA หลังจากที่ฉันสร้างแอปพลิเคชัน (สิ่งนี้จะต้องเก็บเป็นความลับ)
จากนั้นดาวน์โหลด Weibo SDK ฉันใช้ Weibo4j ใน Java
ปรับเปลี่ยนคีย์แอพและความลับของแอพของคลาส Weibo.java ในแพ็คเกจ SDK ไปยังคีย์แอพและความลับของแอพที่คุณเพิ่งได้รับดังที่แสดงในคำแนะนำต่อไปนี้สำหรับการใช้งาน:
หลังจากเสร็จสิ้นสิ่งเหล่านี้คุณสามารถเริ่มเขียนโค้ดตามการสาธิตที่ให้ไว้ ดังนี้:
Weboauth.java ใช้ในการเริ่มต้นคีย์แอพและความลับของแอพที่จำเป็นสำหรับคลาส Weibo.java และให้วิธีการในการ getRequesttoken () และ getTaccessToken () เพื่อขอรับโทเค็นการร้องขอและการเข้าถึง พารามิเตอร์ที่ต้องการจะแสดงในรหัส นอกจากนี้ยังมีวิธีการเผยแพร่ข้อความ Weibo เพื่ออัปเดต ()
แพ็คเกจ weibo4j.examples; นำเข้า weibo4j.status; นำเข้า weibo4j.weibo; นำเข้า weibo4j.weiboexception; นำเข้า weibo4j.http.accessToken; นำเข้า weibo4j.http.requesttoken; นำเข้า java.io.unsupportencodingexception; // การรับรองความถูกต้องของเว็บคลาสสาธารณะ Weboauth {ส่วนตัว Weibo Weibo; Public Weboauth () {// เตรียมคีย์ผู้บริโภคและความลับของผู้บริโภค // ที่สอดคล้องกับแอปพลิเคชัน Sina Weibo เป็นแอพที่คุณใช้สำหรับคีย์และคีย์ระบบ SetSetProperty ("weibo4j.oauth.consumerkey", weibo.consumer_key); System.SetProperty ("Weibo4j.oauth.consumersecret", Weibo.consumer_secret); Weibo = ใหม่ weibo (); } // รับการร้องขอโทเค็นการร้องขอสาธารณะตามคำสั่งเรียกกลับเข้ามาในที่สาธารณะ getRequestToken (สตริง backurl) {ลอง {// ระบุ callback_url และรับคำขอโทเค็น requestToken = weibo.getOauthRequestToken (backurl); System.out.println ("คำขอโทเค็น:" + requesttoken.getToken ()); System.out.println ("คำขอโทเค็นความลับ:" + requesttoken.getTokenSecret ()); return requestToken; } catch (exception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อได้รับโทเค็นคำขอ!"); E.PrintStackTrace (); คืนค่า null; }} // รับการเข้าถึงโทเค็นสาธารณะตามคำขอที่เข้ามาโทเค็นและตัวตรวจสอบ AccessToken getTaccessToken (RequestToken RequestToken, String Verifier) {ลอง {AccessToken AccessToken = Weibo.getoauthaccessToken (requestToken .getToken () System.out.println ("การเข้าถึงโทเค็น:" + AccessToken.getToken ()); System.out.println ("การเข้าถึงโทเค็นลับ:" + accesstoken.getTokensecret ()); return AccessToken; } catch (exception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อได้รับโทเค็นการเข้าถึง!"); E.PrintStackTrace (); คืนค่า null; }} // โพสต์ Weibo ตามโทเค็นการเข้าถึงที่เข้ามาและการอัปเดตโมฆะสาธารณะ (AccessToken Access, เนื้อหาสตริง) {ลอง {weibo.settoken (access.getToken (), access.getTokenSecret ()); content = สตริงใหม่ (content.getBytes ("GBK"), "UTF-8"); สถานะสถานะ = weibo.updatestatus (เนื้อหา); System.out.println ("โพสต์สำเร็จบน Weibo:" + status.getText () + "."); } catch (unsupportencodingexception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อเนื้อหา Weibo ถูกแปลงเป็นการเข้ารหัส!"); E.PrintStackTrace (); } catch (weiboexception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อ Weibo โพสต์ข้อยกเว้น!"); E.PrintStackTrace (); }}} request.jsp ใช้เพื่อให้ callback_url (ที่นี่เราปรับแต่งเป็น callback.jsp ในต่อไปนี้) หลังจากได้รับการร้องขอให้บันทึกการร้องขอเข้าสู่เซสชันและเปลี่ยนเส้นทางหน้าไปยังการโทรกลับ JSP สำหรับการตรวจสอบและการอนุญาต < %@ page contentType = "text/html; charset = utf-8" %> < %@ page language = "java" import = "weibo4j.*" %> < %@ page language = "java" import = "weibo4j.http.*" %> id = "weboauth" scope = "เซสชัน"/> <% ถ้า ("1" .equals (request.getParameter ("opt"))) {// ผ่านใน callback_url สตริง callback_url = "http: // localhost: 8080/sinaweibo/callback.jsp"; requestToken requestToken = weboauth.getRequestToken (callback_url); if (requestToken! = null) {out.println (requestToken.getToken ()); out.println (requesttoken.getTokensecret ()); session.setAttribute ("RequestToken", RequestToken); string url = requestToken.getAuthorizationUrl ()+"& oauth_callback ="+callback_url; System.out.println ("AuthorizationUrl:" + URL); //barebonesbrowserlaunch.openurl(callback_url); //response.sendredirect (requesttoken.getauthorizationurl ()); // เปลี่ยนเส้นทางไปยังหน้าการตรวจสอบความถูกต้องของ Sina Weibo ด้วยที่อยู่การเรียกกลับ callback_url ที่แนบมากับการตอบสนอง sendretirect (URL); } else {out.println ("ข้อผิดพลาดคำขอ"); }} else { %> <a href = "request.jsp? opt = 1"> กรุณาคลิกที่การตรวจสอบความถูกต้องของ OAuth ในวิธีการทางเว็บ! </a> < %} %>
callback.jsp หลังจากเปลี่ยนเส้นทางในขั้นตอนก่อนหน้าพารามิเตอร์ OAuth_Verifier จะถูกแนบกับ callback_url ในเวลานี้เรานำไปใช้เพื่อรับ AccessToken ตามคำขอที่บันทึกไว้ในเซสชันและพารามิเตอร์ OAuth_Verifier ที่ได้รับ เมื่อได้รับ AccessToken แล้วเราจะเปลี่ยนหน้าไปยัง Writeweibo.html หน้าเว็บที่เขียน Weibo
<%@ page contentType = "text /html; charset = utf-8"%> <%@ page language = "java" import = "weibo4j.http.*"%> <%@ page language = "java" import = "weibo4j.*"%> ใน http คำขอสตริง verifier = request.getParameter ("oauth_verifier"); out.println ("oauth_verifier:"+verifier); System.out.println ("OAuth_verifier:"+Verifier); ถ้า (verifier! = null) {requestToken requestToken = (requestToken) เซสชัน. getAttribute ("requestToken"); if (requestToken! = null) {AccessToken AccessToken = weboauth.getTaccessToken (RequestToken, Verifier); if (AccessToken! = null) {ลอง {session.setAttribute ("AccessToken", AccessToken); out.println ("5 ไปที่ writeweibo.html"); Thread.sleep (5000); Response.sendredirect ("http: // localhost: 8080/sinaweibo/writeweibo.html"); } catch (exception e) {e.printstacktrace (); }} else {out.println ("ข้อผิดพลาดการร้องขอโทเค็นการเข้าถึง"); }} else {out.println ("ข้อผิดพลาดเซสชันโทเค็นคำขอ"); }} else {out.println ("ข้อผิดพลาดสตริง verifier"); } %> writeweibo.html, ไฟล์ HTML ที่ง่ายมาก <html> <head> <title> โพสต์ Sina Weibo </title> </head> <body bgcolor = "#d0d0d0"> <form action = "updateweibo.jsp" method = "post"> โปรดเขียนข้อความภายใน 140 ตัวอักษรที่นี่: </br> <textarea name = "Weibotext" </textarea> </br> <อินพุต type = "ส่ง" value = "เผยแพร่"> <อินพุต type = "รีเซ็ต" value = "clear"> </br> </form> </body> </html> updateWeibo.jsp ใช้ในการโพสต์ข้อความ Weibo <%@ page contentType = "text /html; charset = utf-8"%> <%@ page language = "java" import = "weibo4j.http.*"%> <%@ page language = "Java" import = "Weibo4j.*"%> (AccessToken) Session.getAttribute ("AccessToken"); String weibotext = (string) request.getParameter ("Weibotext"); // การโพสต์อย่างต่อเนื่องของเนื้อหา Weibo เดียวกันจะส่งคืนข้อผิดพลาด 400 ข้อผิดพลาด weboauth.update (AccessToken, Weibotext); out.println ("Weibotext เผยแพร่สำเร็จ!"); -
ก่อนที่จะทำงานเราต้องเตรียม Tomcat และใส่ไฟล์ต้นฉบับด้านบนลงในไดเรกทอรีที่ถูกต้อง นอกจากนี้คุณควรเพิ่มแพ็คเกจ Commons-httpClient-3.1.jar ในแพ็คเกจ SDK ในไดเรกทอรี /web-inf /lib รวมถึง weibo4j.jar ฉันรวบรวมและบรรจุตัวเอง (ซึ่งเป็นการใช้งาน Java เฉพาะในแพลตฟอร์ม Open Sina Weibo)
เรียกใช้ tomcat และเข้าถึงหน้า request.jsp ในเบราว์เซอร์ของคุณดังแสดงในรูปด้านล่าง:
คลิกที่ลิงค์ในดังที่แสดงในรูปด้านล่าง (หมายเหตุการเปลี่ยนแปลงในแถบที่อยู่):
URL ของแถบที่อยู่มีดังนี้:
http://api.t.sina.com.cn/oauth/authorize?oauth_token=efda6f2499877d0e6d814f8c3d31a1d1&oauth_callback=http://localhost:80800/sinawe
กรอกบัญชีและรหัสผ่าน Sina Weibo ที่เฉพาะเจาะจงและถูกต้องและอนุญาต ต่อไปนี้เป็นผลลัพธ์ของการเติมในบัญชี Weibo ของฉันสำหรับการทดสอบและอนุญาต:
URL ของแถบที่อยู่มีดังนี้:
http: // localhost: 8080/sinaweibo/writeweibo.html
คลิก "เผยแพร่" ดังที่แสดงด้านล่าง:
เข้าสู่ระบบ Weibo เพื่อดูดังที่แสดงด้านล่าง:
ตรวจสอบรายการแอปพลิเคชันที่ได้รับอนุญาตจากบัญชีนี้:
ณ จุดนี้อาจเป็นกระบวนการเกี่ยวกับวิธี OAuth ที่จะใช้แพลตฟอร์ม Open Sina Weibo เพื่อโพสต์ Weibo
สรุป:
1. อันที่จริงยังมีรายละเอียดมากมายที่ฉันไม่ได้พูดถึง ฉันได้ลองหลายครั้งก่อนที่ฉันจะค้นพบปัญหาเข้าใจปัญหาแล้วแก้ไขปัญหา
2. หากคุกกี้สำหรับการเข้าสู่ระบบของเราไปยังข้อมูลบัญชี Sina Weibo ได้รับการบันทึกไว้ในเบราว์เซอร์คุณไม่จำเป็นต้องป้อนข้อมูลบัญชีเมื่ออนุญาต แน่นอนคุณสามารถแก้ไขได้โดยไม่ต้องใช้บัญชีปัจจุบันเพื่อการอนุญาต
3. นอกจากนี้ยังมีข้อมูลบางอย่างที่ป้อนโดยคอนโซลเช่นโทเค็น URL และข้อมูลการส่งคืนเซิร์ฟเวอร์ซึ่งไม่ได้รับในภาพหน้าจอ