Google API, בדגש על "אנשי קשר" של גוגל
-
המשך לשרשור קודם שהתחיל להתפתח לכיוון Google API.
טוב. אז אני עוצר עם ההתברברות ופונה לעזרתכם (עם קריצה גדולה ל @דוד ל.ט. - אכן, זה היה מובן מאליו שהשאלה הזאת תגיע... )
איך צולחים את משוכת ההזדהות מול גוגל?
כתבתי את השורות דלהלן על סמך דוגמא של גוגל שרלוונטית לגוגל בוקס וממש לא לקונטקטס:
Dim credential As UserCredential Using stream = New FileStream("D:\BlaBla\kuku\contacts_mysql.JSON", FileMode.Open, FileAccess.Read) credential = Await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, {"https://www.google.com/m8/feeds/"}, "user", CancellationToken.None, New FileDataStore("Google.Apis.Auth")) End Usingבהרצה, אכן התוכנה הקפיצה דפדפן וביקשה אישור לאנשי קשר עבור התוכנה שלי, וכשאישרתי היא הודיעה שקיבלתי טוקן. (וואו, איזה גאווה!)
אבל בזה זה נגמר.
כשאני מנסה לשלוח לגוגל שאילתא פשוטה, הוא מחזיר לי "401 לא מורשה".
עשיתי Break Point והסתכלתי על המשתנה credential אחרי קבלת הטוקן, ומה שמיד קפץ לי לעין זה הפרופרטי: Scope עם ערך Nothing.חשוב לי לציין, שהערך "user" בשורת ה credential זה לא דוגמא, אלא זה מה שכתבתי בפועל. אני אמור לכתוב משהו אחר?
בכלל, אני לא מבין / מוצא הסבר ברור (עד התשובות שיבואו כאן), על הפרמטרים של GoogleWebAuthorizationBroker.AuthorizeAsyncתודה רבה!!!
פורסם במקור בפורום CODE613 ב08/12/2017 00:43 (+02:00)
-
יפה מאוד!
אני ממש לא מבין איך זה יכול להיות, אבל בניגוד גמור למה שנראה בתיעוד של גוגל הרשמי (פה), הרי שחובה לסקופ ההרשאה גם https://www.googleapis.com/auth/contacts. למעשה לקריאה בלבד כמו המקרה שלך יכולת לראות בתיעוד הרשמי שדי בhttps://www.googleapis.com/auth/contacts.readonly, כלומר תחליף את הפרמטר השני:
{"https://www.google.com/m8/feeds/"}
בזה:
{"https://www.googleapis.com/auth/contacts.readonly"}אם תרצה כתיבה (לשנות, למחוק, להוסיף), תצטרך לשנות ל:
{"https://www.googleapis.com/auth/contacts","https://www.google.com/m8/feeds/"}
וזה אני תמה שזה לא נראה כך בתיעוד (כלומר שדי ב/m8/feeds אותו שמת בשביל הרשאה מלאה כולל כתיבה ושינוי).(המשמעות של הפרמטר הזה היא מה אנחנו רוצים לבקש מהמשתמש לאפשר עבורנו, בקריאה בלבד יהיה כתוב "XYZ רוצה לגשת לאנשי הקשר שלך". ולכן כל פעולת שינוי תיתקל ב404-לא מורשה. הגיוני.
אבל כשהסקופ הוא /m8/feeds, הוא כותב "XYZ רוצה לנהל את אנשי הקשר שלך", וזה מעצים את השאלה למה מתקבל 404. )פורסם במקור בפורום CODE613 ב08/12/2017 03:00 (+02:00)
-
בס"ד
תודה רבה על התשובה!
1. סתם הערה שולית, אולי זה משמעותי? השגיאה שהוא מחזיר היא 401 לא מורשה (לא 404).
2. אני גם ראיתי את התיעוד הרשמי עם 2 האפשרויות: לקריאה בלבד / גם כתיבה, ומשם גם לקחתי את הכתובת של ה Scope.
הסיבה שרציתי גם כתיבה, א' כי למה לא? ב', אני חולם בעתיד לעשות לאשתי מערכת ממוחשבת לניהול הלקוחות, ואז ארצה גם לעדכן את גוגל.3. למעשה, בדקתי את הסקופ גם עם הכתובת לקריאה בלבד, וגם עם 2 הכתובות שציינת - עבור כתיבה - אותו דבר. 401 לא מורשה.
4. שאר הפרמטרים שכתבתי נכונים? המילה "user" היא לא לדוגמא! זה מה שכתבתי בפועל! כך צריך להיות באמת?
ניסיתי גם לשים שם את ה client id שלי במקום user, אבל זה לא שינה כלום.השאלה הגדולה היא, האם בכלל אני כותב את השאילתא עצמה נכון, אולי שם טמונה הבעייה שלי? (ובמילים אחרות, תלמדו אותי תיכנות :lol:)
כך כתבתי את השאילתא:Dim googleQuery As String = "https://www.google.com/m8/feeds/contacts/" & txtAccount.Text & "/full" Dim request As WebRequest = WebRequest.Create(googleQuery) Try Using response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse) ....ובשלב זה הוא מנסה להתחבר לגוגל וזורק את ה-exception של לא מורשה.
את ביצוע השאילתא בדרך זו, ביצעתי בעבר לצורך שליפה מ"גוגל מפות" - של קואורדינטות לפי כתובות וכתובות לפי קואורדינטות.
ואכן, שם זה עבד נהדר, (הוספתי תג "GPS" לתמונות שחור-לבן סרוקות מחתונת סבא וסבתא שלי :mrgreen:) אלא שגוגל מפות לא דורש טוקן.פורסם במקור בפורום CODE613 ב10/12/2017 00:02 (+02:00)
-
- טעות שלי, 404 זה לא נמצא. לא מורשה זה אכן 401.
3+4, זהו יש לך אכן טעות.
אימות מול API באינטרנט עובד ע"י שאתה עובר אימות ומקבל טוקן (בגישה דפדפנית זה בעצם העוגיה). עם הטוקן הזה ואיתו בלבד אתה צריך לבקש את כל הבקשות בהמשך. כשאתה כתבת request לא סיפקת את הטוקן הזה כלל (לגוגל לא יכול להיות מושג אם מי שמבקש עכשיו את האנשי קשר זה אותו אחד שלפני שניה קיבל את אישור הגישה). חוץ מזה בדרך הזאת אתה צריך להמיר טקסט של תשובות לאובייקטים ולהפך בכל תקשורת.
בשביל לא להסתבך בכל הנ"ל גוגל פיתחה DLL, אולי כבר התקנת אבל אם לא קח אותו בנוגט, שמו Google.GData.Contacts,
הוא אמור לחסוך לך את כל העבודה השחורה הזו.
אני מצרף פה קוד שלקחתי מתוכנית שלי מפעם, ותראה את העיקרון:
Sub Import(settings As RequestSettings, fromDate As DateTime) Dim cr = New ContactsRequest(settings) Dim query = New ContactsQuery(ContactsQuery.CreateContactsUri("default")) query.NumberToRetrieve = 500 query.StartDate = fromDate Dim start = 1 query.StartIndex = start Do query.StartIndex = start Dim co = cr.Get(Of Contact)(query) For Each item In co.Entries start += 1 Console.WriteLine(item.Name.FullName) For Each mail In item.Emails.Select(Function(c) c.Address) Console.WriteLine(mail) Next Next Loop Until start = query.StartIndex End Sub
כדי להשתמש בזה עליך ליצור מהתשובה של גוגל RequestSetting שבעצם מכיל את הטוקן:
Dim settings As RequestSettings Using stream = New FileStream("D:\BlaBla\kuku\contacts_mysql.JSON", FileMode.Open, FileAccess.Read) Dim cs = New ClientSecrets With {.ClientId = clientId, .ClientSecret = clientSecret} Dim credential = Await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, {"https://www.google.com/m8/feeds/", "https://www.googleapis.com/auth/contacts"}, "user", CancellationToken.None, New FileDataStore("Google.Apis.Auth")) Dim parameters = New OAuth2Parameters() parameters.AccessToken = credential.Token.AccessToken parameters.RefreshToken = credential.Token.RefreshToken settings = New RequestSettings("Google contacts tutorial", parameters) End Using Import(settings, DateTime.MinValue)
בקשר לפרמטרים של הAuthorizeAsync:
הפרמטר user נראה לי חסר משמעות לא הצלחתי להבין למה הם התכוונו ועל מה זה משליך.
הפרמטר של הFileDataStore אומר באיזה שם הטוקן יישמר מחשב הנוכחי. אתה יכול לקובע איזה טקסט שתרצה.פורסם במקור בפורום CODE613 ב10/12/2017 00:43 (+02:00)
- טעות שלי, 404 זה לא נמצא. לא מורשה זה אכן 401.
-
בס"ד
@דוד ל.ט. , קודם כל תודה ענקית! איזה כיף זה שיש אמא טובה כמו דוד שמסכימה להאכיל בכפית - את כל מי שרק מבקש!
למעשה,
עם הדוגמא שהבאת הוא אכן כבר לא צעק "401 לא מורשה", אבל עדיין הוא מודיע שהשאילתא נכשלה.
מה שעשיתי (בעקבות מקטע ה-UPDATE של השואל כאן), הוספתי למשתנה parameters את הפרופרטיז הבאים:parameters.ClientId = "BlaBlaBla.apps.googleusercontent.com" parameters.ClientSecret = "KukuAaaGlidaHama"והעסק התחיל לעבוד.
אני רואה שגם בקוד שלך - הכנת משתנה בשם cs שמכיל את ה ID והסיסמא, אבל למעשה אתה לא עושה בו שימוש בהמשך הקוד (שהעלית).
ועכשיו מגיעה שאלת ההמשך:
אם באמת אני נאלץ לשתול בקוד עצמו את ה-id והסיסמה, ולא להפנות אותו לקובץ json שבמחשב,
והאמת זה גם די הגיוני, אם אני שם את התוכנה במחשב אחר, הרי אין שם לא בלה בלה ולא קוקו :lol: (האמת שגם אצלי אין), אז מאיפה יהיה לו טוקן?
האם זה לא סיכון לשים אותם כך גלויים בתוכנה? כל רפלקטור פשוט יחשוף אותם קומפלט! מה גם שגוגל מזהירים מזה כל הזמן.
יש לזה איזשהו פתרון?תודה רבה!!!
פורסם במקור בפורום CODE613 ב10/12/2017 11:58 (+02:00)
-
הcs שלא משומש הוא שארית מטרום התאמת הדוגמה לקוד שלך שטוען מקובץ.
כלומר החלפתי את cs במשפט
GoogleClientSecrets.Load(stream).Secrets.
והוא כנראה לא עובד.בכל אופן כעת אינני מבין איך עובד לך.
לעניין האבטחה אין הבדל בין גוף התוכנה לקובץ חיצוני (אם כבר יש עדיפות לגוף התוכנה)
אבל יש עדיפות לקובץ חיצוני מהפן של תחזוק התוכנה: יש להפריד בין קוד קשיח לבין פרמטרים משתנים.
בשביל זה אמורה השיטה של קריאת JSON לעבוד, מקסימום תוכל לקרוא ידנית ולשים במשתנים.
(תוכל גם להשתמש עם הSettings של הפרוייקט שיום אחד תכיר).איך מתגוננים? בגדול אתה לא אמור לחשוף בכלל את התוכנה הזאת.
כמו"כ אתה יכול בהגדרות המפתח להגביל אותו לIP או טווח IP. וגם שיעבוד רק לcontacts (זה רלוונטי אם אפשרת עוד API באותו פרוייקט).
בContacts Api אין כ"כ מה לחשוש, יש בחינם עד 20 מליון שאילתות חינם ביום, ועד 1000 בשניה. אחרי כן זה לא יעלה לך גרוש כי זה פשוט ייחסם בברירת מחדל.פורסם במקור בפורום CODE613 ב10/12/2017 15:05 (+02:00)
-
בס"ד
קודם כל, תודה על העריכה והעברת נושא ה"נטפרי" לשרשור חדש - באמת יותר הגיוני. לא חשבתי שזה יתפתח עד כדי כך.
גם לא פספסתי את הענווה שלך שהשמטת את עצמך באלגנטיות מלהיות מוזכר בהודעה שלי לאחר עריכתה...כרגע כמובן אין לי את היכולת להתקדם עם הסנכרון מהתוכנה שלי מול גוגל - כי גם היא לא מצליחה להתחבר לגוגל...
רק שאלה קטנה:@דוד ל.ט.
(תוכל גם להשתמש עם הSettings של הפרוייקט שיום אחד תכיר).
האם אתה מתכוון ל Resources?
כי אם כן, אני בהחלט מכיר את זה, השתמשתי בזה לא פעם.
אבל האם הנתונים שמופיעים שם לא נחשפים ברפלקטור?תודה רבה!
פורסם במקור בפורום CODE613 ב10/12/2017 17:58 (+02:00)