OAuth2: אימות משתמשים באמצעות Google

OAuth2 הוא הפרוטוקול המקובל בתחום להרשאה. היא מספקת מנגנון למשתמשים כדי להעניק לאפליקציות אינטרנט ובמחשב גישה למידע פרטי בלי לשתף את שם המשתמש שלהם, סיסמה ופרטי כניסה פרטיים אחרים.

המדריך הזה יוצר תוסף שמאפשר לגשת לאנשי הקשר של המשתמש ב-Google באמצעות אנשי Google API ו-Chrome Identity API. בגלל שתוספים לא נטענים ב-HTTPS, אי אפשר לבצע אותם הן מגדירות קובצי Cookie או מפנות מחדש ל-Chrome Identity API כדי להשתמש ב-OAuth2.

שנתחיל?

כדי להתחיל, יוצרים ספרייה ואת הקבצים הבאים לתחילת פעולה.

אפשר להוריד את התוסף המלא במלואו כאן.

manifest.json

כדי להוסיף את המניפסט, יוצרים קובץ בשם manifest.json וכוללים את הקוד הבא. או מורידים את הקובץ כאן.

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 2,
  "browser_action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  }
}

background.js

מוסיפים את סקריפט הרקע על ידי יצירת קובץ בשם background.js וכוללים את הקוד הבא. לחלופין, אפשר להוריד את הקובץ מכאן.

chrome.browserAction.onClicked.addListener(function() {
  chrome.tabs.create({url: 'index.html'});
});

index.html

צריך להוסיף קובץ HTML בשם index.html ולכלול את הקוד הבא. לחלופין, אפשר להוריד את הקובץ מכאן.

<html>
  <head>
    <title>FriendBlock</title>
    <style>
      button {
        padding: 10px;
        background-color: #3C79F8;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <button>FriendBlock Contacts</button>
    <div id="friendDiv"></div>
  </body>
</html>

העלאה למרכז השליטה למפתחים

אורזים את ספריית התוספים לקובץ .zip ומעלים אותה אל מפתח Chrome מרכז הבקרה בלי לפרסם אותו:

  1. במרכז השליטה למפתחים, לוחצים על הוספת פריט חדש.
  2. לוחצים על בחירת קובץ, בוחרים את ספריית התוספים .zip ומעלים אותה.
  3. בלי למלא שדות נוספים, בוחרים באפשרות שמירת טיוטה וחזרה למרכז הבקרה.

מאתרים את התוסף בקטע הכרטיסי המוצר שלך ולוחצים על מידע נוסף. מהחלון הקופץ, מעתיקים את מפתח ציבורי ומוסיפים אותו למניפסט שבספרייה המחולקת בשדה "key".

{
  "name": "OAuth Tutorial FaceBlcok",
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8G...AQAB"
}

השוואה בין מזהים

פותחים את הדף 'ניהול תוספים' בכתובת chrome://extensions, מוודאים שמצב הפיתוח מופעל להעלות את ספריית התוספים הלא ארוזים. להשוות את מזהה התוסף בניהול התוספים לדף 'מזהה פריט' במרכז השליטה למפתחים. הם אמורים להיות זהים.

המזהה של התוסף תואם בכל המקומות

כדי לשמור על אותו מזהה, התוסף "key" יכלול את השדה במניפסט. שימור מזהה יחיד חיוני לרישום API.

יצירת מזהה לקוח ב-OAuth

עוברים אל מסוף Google API ויוצרים פרויקט חדש. אחרי שמוכנים, בוחרים Credentials בסרגל הצד, לוחצים על Create credentials (יצירת פרטי כניסה) ובוחרים באפשרות OAuth client ID (מזהה לקוח OAuth).

יצירת פרטי כניסה לתוסף

בדף 'יצירת מזהה לקוח', בוחרים באפשרות אפליקציית Chrome. ממלאים את שם התוסף ואת שם המקום. מזהה התוסף בסוף כתובת ה-URL בשדה Application ID (מזהה אפליקציה).

מילוי פרטי התוסף

לוחצים על 'יצירה' כדי לסיים את הפעולה. המסוף יספק מזהה לקוח OAuth.

רישום OAuth במניפסט

כוללים את השדה "oauth2" במניפסט של התוסף. מזינים את מזהה לקוח ה-OAuth שנוצר בקטע "client_id" לכלול כרגע מחרוזת ריקה ב-"scopes".

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes":[""]
  },
  ...
}

התחלת תהליך OAuth ראשון

רושמים את ההרשאה identity במניפסט.

{
  "name": "OAuth Tutorial FaceBlcok",
  ...
  "permissions": [
    "identity"
  ],
  ...
}

יצירת קובץ לניהול תהליך ה-OAuth שנקרא oauth.js, ולכלול את הקוד הבא. או הורדה כאן.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      console.log(token);
    });
  });
};

יש להציב תג סקריפט עבור oauth.js בחלק העליון של index.html.

...
  <head>
    <title>FriendBlock</title>
    ...
    <script type="text/javascript" src="oauth.js"></script>
  </head>
...

טוענים מחדש את התוסף ולוחצים על סמל הדפדפן כדי לפתוח את index.html. פותחים את המסוף ולוחצים ב-'FriendBlock Contacts (אנשי קשר) לחצן. אסימון OAuth יופיע במסוף.

הצגת האסימון במסוף

הפעלת Google People API

חוזרים למסוף Google API ובוחרים באפשרות ספרייה בסרגל הצד. חיפוש של 'Google People' API', לוחצים על התוצאה המתאימה ומפעילים אותה.

הפעלת People API

צריך להוסיף את ספריית הלקוח Google People API אל "scopes" במניפסט של התוסף.

{
  "name": "OAuth Tutorial FaceBlcok",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/contacts.readonly"
    ]
  },
  ...
}

חוזרים למסוף Google API וחוזרים לפרטי הכניסה. לוחצים על "Create credentials" (יצירת פרטי כניסה). וגם בחירה באפשרות API key מהתפריט הנפתח.

יצירת פרטי כניסה ל-People API

שומרים את מפתח ה-API שנוצר לשימוש מאוחר יותר.

ליצירת בקשת API ראשונה

עכשיו, שלתוסף יש הרשאות ופרטי כניסה מתאימים, והוא יכול לתת הרשאה למשתמש Google, הוא יכול לבקש נתונים דרך People API. צריך לעדכן את הקוד ב-oauth.js בהתאם לערך שלמטה.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
          init)
          .then((response) => response.json())
          .then(function(data) {
            console.log(data)
          });
    });
  });
};

מחליפים את API_KEY במפתח ה-API שנוצר ממסוף Google API. התוסף צריך לרשום אובייקט JSON שכולל מערך של people/account_id במסגרת שדה memberResourceNames.

חסימת פנים

עכשיו, כשהתוסף מחזיר רשימה של אנשי הקשר של המשתמש, הוא יכול לשלוח בקשות נוספות. כדי לאחזר את הפרופילים והפרטים של אנשי הקשר האלה . התוסף ישתמש memberResourceNames כדי לאחזר את פרטי התמונות של אנשי הקשר של המשתמש. יש לעדכן את oauth.js ל- כוללים את הקוד הבא.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=<API_Key_Here>',
          init)
          .then((response) => response.json())
          .then(function(data) {
            let photoDiv = document.querySelector('#friendDiv');
            let returnedContacts = data.memberResourceNames;
            for (let i = 0; i < returnedContacts.length; i++) {
              fetch(
                  'https://people.googleapis.com/v1/' + returnedContacts[i] +
                      '?personFields=photos&key=API_KEY',
                  init)
                  .then((response) => response.json())
                  .then(function(data) {
                    let profileImg = document.createElement('img');
                    profileImg.src = data.photos[0].url;
                    photoDiv.appendChild(profileImg);
                  });
            };
          });
    });
  });
};

טוענים מחדש וחוזרים לתוסף. לחצו על הלחצן FriendsBlock ו-Ta-da! כיף לראות את הפנים של איש הקשר ב- בלוק.

פנים של אנשי קשר בבלוק