דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. Google API, בדגש על "אנשי קשר" של גוגל

Google API, בדגש על "אנשי קשר" של גוגל

מתוזמן נעוץ נעול הועבר ארכיון code613m
9 פוסטים 3 כותבים 648 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • איש אחדא מנותק
    איש אחדא מנותק
    איש אחד
    כתב ב נערך לאחרונה על ידי
    #1

    המשך לשרשור קודם שהתחיל להתפתח לכיוון Google API.

    טוב. אז אני עוצר עם ההתברברות ופונה לעזרתכם (עם קריצה גדולה ל @דוד ל.ט. - אכן, זה היה מובן מאליו שהשאלה הזאת תגיע... :smile: )

    איך צולחים את משוכת ההזדהות מול גוגל?

    כתבתי את השורות דלהלן על סמך דוגמא של גוגל שרלוונטית לגוגל בוקס וממש לא לקונטקטס:

    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)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      יפה מאוד!
      אני ממש לא מבין איך זה יכול להיות, אבל בניגוד גמור למה שנראה בתיעוד של גוגל הרשמי (פה), הרי שחובה לסקופ ההרשאה גם 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)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      2
      • איש אחדא מנותק
        איש אחדא מנותק
        איש אחד
        כתב ב נערך לאחרונה על ידי
        #3

        בס"ד

        תודה רבה על התשובה!

        1. סתם הערה שולית, אולי זה משמעותי? השגיאה שהוא מחזיר היא 401 לא מורשה (לא 404).

        2. אני גם ראיתי את התיעוד הרשמי עם 2 האפשרויות: לקריאה בלבד / גם כתיבה, ומשם גם לקחתי את הכתובת של ה Scope.
        הסיבה שרציתי גם כתיבה, א' כי למה לא? :smile: ב', אני חולם בעתיד לעשות לאשתי מערכת ממוחשבת לניהול הלקוחות, ואז ארצה גם לעדכן את גוגל.

        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)

        תגובה 1 תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4
          1. טעות שלי, 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)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          1
          • איש אחדא מנותק
            איש אחדא מנותק
            איש אחד
            כתב ב נערך לאחרונה על ידי
            #5

            בס"ד

            @דוד ל.ט. , קודם כל תודה ענקית! איזה כיף זה שיש אמא טובה כמו דוד שמסכימה להאכיל בכפית - את כל מי שרק מבקש!

            למעשה,
            עם הדוגמא שהבאת הוא אכן כבר לא צעק "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)

            תגובה 1 תגובה אחרונה
            0
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              הcs שלא משומש הוא שארית מטרום התאמת הדוגמה לקוד שלך שטוען מקובץ.
              כלומר החלפתי את cs במשפט
              GoogleClientSecrets.Load(stream).Secrets.
              והוא כנראה לא עובד.

              בכל אופן כעת אינני מבין איך עובד לך.
              לעניין האבטחה אין הבדל בין גוף התוכנה לקובץ חיצוני (אם כבר יש עדיפות לגוף התוכנה)
              אבל יש עדיפות לקובץ חיצוני מהפן של תחזוק התוכנה: יש להפריד בין קוד קשיח לבין פרמטרים משתנים.
              בשביל זה אמורה השיטה של קריאת JSON לעבוד, מקסימום תוכל לקרוא ידנית ולשים במשתנים.
              (תוכל גם להשתמש עם הSettings של הפרוייקט שיום אחד תכיר).

              איך מתגוננים? בגדול אתה לא אמור לחשוף בכלל את התוכנה הזאת.
              כמו"כ אתה יכול בהגדרות המפתח להגביל אותו לIP או טווח IP. וגם שיעבוד רק לcontacts (זה רלוונטי אם אפשרת עוד API באותו פרוייקט).
              בContacts Api אין כ"כ מה לחשוש, יש בחינם עד 20 מליון שאילתות חינם ביום, ועד 1000 בשניה. אחרי כן זה לא יעלה לך גרוש כי זה פשוט ייחסם בברירת מחדל.

              פורסם במקור בפורום CODE613 ב10/12/2017 15:05 (+02:00)

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              1
              • איש אחדא מנותק
                איש אחדא מנותק
                איש אחד
                כתב ב נערך לאחרונה על ידי
                #7

                בס"ד

                קודם כל, תודה על העריכה והעברת נושא ה"נטפרי" לשרשור חדש - באמת יותר הגיוני. לא חשבתי שזה יתפתח עד כדי כך.
                גם לא פספסתי את הענווה שלך שהשמטת את עצמך באלגנטיות מלהיות מוזכר בהודעה שלי לאחר עריכתה...

                כרגע כמובן אין לי את היכולת להתקדם עם הסנכרון מהתוכנה שלי מול גוגל - כי גם היא לא מצליחה להתחבר לגוגל... 😞

                רק שאלה קטנה:@דוד ל.ט.

                (תוכל גם להשתמש עם הSettings של הפרוייקט שיום אחד תכיר).

                האם אתה מתכוון ל Resources?
                כי אם כן, אני בהחלט מכיר את זה, השתמשתי בזה לא פעם.
                אבל האם הנתונים שמופיעים שם לא נחשפים ברפלקטור?

                תודה רבה!

                פורסם במקור בפורום CODE613 ב10/12/2017 17:58 (+02:00)

                תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  כתב ב נערך לאחרונה על ידי
                  #8

                  זה לא Resource. והכל הכל חשוף, ולא צריך אפי' רפלקטור.
                  זה לא בתור פתרון להגנה, שים לב טוב למה שכתבתי.

                  פורסם במקור בפורום CODE613 ב10/12/2017 20:25 (+02:00)

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  0
                  • מ מנותק
                    מ מנותק
                    מנצפך 0
                    כתב ב נערך לאחרונה על ידי
                    #9

                    הפתרון הוא כפי שכתבו, לא לשים את הנתונים לוקלית על המחשב של הלקוח.

                    פורסם במקור בפורום CODE613 ב10/12/2017 21:27 (+02:00)

                    תגובה 1 תגובה אחרונה
                    0

                    בא תתחבר לדף היומי!
                    • התחברות

                    • אין לך חשבון עדיין? הרשמה

                    • התחברו או הירשמו כדי לחפש.
                    • פוסט ראשון
                      פוסט אחרון
                    0
                    • דף הבית
                    • קטגוריות
                    • פוסטים אחרונים
                    • משתמשים
                    • חיפוש
                    • חוקי הפורום