دليل سريع للبدء باستخدام JavaScript

يمكنكم إنشاء تطبيق ويب بلغة JavaScript يرسل طلبات إلى Google Classroom API.

توضّح الأدلة السريعة كيفية إعداد تطبيق وتشغيله لاستدعاء Google Workspace API. يستخدم هذا الدليل السريع طريقة مصادقة مبسطة مناسبة لبيئة الاختبار. بالنسبة إلى بيئة الإنتاج، ننصحكم بالتعرّف على المصادقة والتفويض قبل اختيار بيانات الاعتماد المناسبة لتطبيقكم.

يستخدم هذا الدليل السريع مكتبات عملاء واجهة برمجة التطبيقات المقترَحة من Google Workspace للتعامل مع بعض تفاصيل عملية المصادقة والتفويض.

الأهداف

  • إعداد البيئة
  • إعداد النموذج
  • تشغيل النموذج

المتطلبات الأساسية

  • حساب على Google for Education مفعَّل فيه Google Classroom

إعداد البيئة

لإكمال هذا الدليل السريع، يجب إعداد البيئة.

تفعيل واجهة برمجة التطبيقات

قبل استخدام Google APIs، يجب تفعيلها في مشروع على Google Cloud. يمكنكم تفعيل واجهة برمجة تطبيقات واحدة أو أكثر في مشروع واحد على Google Cloud.

إعداد شاشة طلب موافقة OAuth

إذا كنتم تستخدمون مشروعًا جديدًا على Google Cloud لإكمال هذا الدليل السريع، يجب إعداد شاشة موافقة OAuth. إذا سبق لكم إكمال هذه الخطوة لمشروعكم على Cloud، انتقِلوا إلى القسم التالي.

  1. في Google API Console، انتقِلوا إلى "القائمة" menu > منصة Google للمصادقة > العلامة التجارية.

    الانتقال إلى العلامة التجارية

  2. إذا سبق لكم إعداد منصة Google للمصادقة، يمكنكم إعداد إعدادات شاشة موافقة OAuth التالية في العلامة التجارية والجمهور والوصول إلى البيانات. إذا ظهرت لكم رس0الة لم يتم إعداد منصة Google للمصادقة بعد، انقروا على البدء:
    1. ضمن معلومات التطبيق، في اسم التطبيق، أدخِلوا اسمًا للتطبيق.
    2. في البريد الإلكتروني لدعم المستخدمين، اختاروا عنوان بريد إلكتروني للدعم يمكن للمستخدمين التواصل من خلاله إذا كانت لديهم أسئلة حول موافقتهم.
    3. انقروا على التالي.
    4. ضمن الجمهور ، اختاروا داخلي.
    5. انقروا على التالي.
    6. ضمن معلومات الاتصال ، أدخِلوا عنوان بريد إلكتروني يمكنكم تلقّي إشعارات عليه بشأن أي تغييرات تطرأ على مشروعكم.
    7. انقروا على التالي.
    8. ضمن إنهاء، راجِعوا سياسة بيانات المستخدمين في خدمات Google API، وإذا كنتم موافقين عليها، اختاروا أوافق على "سياسة بيانات المستخدمين في خدمات Google API".
    9. انقروا على متابعة.
    10. انقروا على إنشاء.
  3. يمكنكم في الوقت الحالي تخطّي إضافة النطاقات. في المستقبل، عند إنشاء تطبيق لاستخدامه خارج مؤسسة Google Workspace، يجب تغيير نوع المستخدم إلى خارجي. بعد ذلك، أضيفوا نطاقات التفويض التي يتطلبها تطبيقكم. لمزيد من المعلومات، يُرجى الاطّلاع على دليل إعداد موافقة OAuth الكامل .

تفويض بيانات اعتماد لتطبيق ويب

لمصادقة المستخدمين النهائيين والوصول إلى بيانات المستخدمين في تطبيقكم، يجب إنشاء معرّف عميل واحد أو أكثر لبروتوكول OAuth 2.0. يُستخدم معرّف العميل لتعريف تطبيق واحد لخوادم OAuth من Google. إذا كان تطبيقكم يعمل على منصات متعددة، يجب إنشاء معرّف عميل منفصل لكل منصة.
  1. في Google API Console، انتقِلوا إلى "القائمة" > منصة Google للمصادقة > العملاء.

    الانتقال إلى العملاء

  2. انقروا على إنشاء عميل.
  3. انقروا على نوع التطبيق > تطبيق ويب.
  4. في حقل الاسم ، اكتبوا اسمًا لبيانات الاعتماد. لا يظهر هذا الاسم إلا في Google API Console.
  5. أضيفوا معرّفات الموارد المنتظمة (URI) المفوَّضة المرتبطة بتطبيقكم:
    • تطبيقات من جهة العميل (JavaScript): ضمن مصادر JavaScript المسموح بها، انقروا على إضافة معرّف الموارد المنتظم (URI). بعد ذلك، أدخِلوا معرّف URI لاستخدامه في طلبات المتصفح. يحدّد هذا المعرّف النطاقات التي يمكن لتطبيقكم إرسال طلبات واجهة برمجة التطبيقات منها إلى خادم OAuth 2.0.
    • تطبيقات من جهة الخادم (Java وPython والمزيد): ضمن معرّفات الموارد المنتظمة (URI) المفوَّضة لإعادة التوجيه، انقروا على إضافة معرّف الموارد المنتظم (URI). بعد ذلك، أدخِلوا معرّف URI لنقطة نهاية يمكن لخادم OAuth 2.0 إرسال الردود إليه.
  6. انقروا على إنشاء.

    تظهر بيانات الاعتماد التي تم إنشاؤها حديثًا ضمن معرّفات عملاء OAuth 2.0.

    يُرجى العِلم أنّه لا يتم استخدام أسرار العميل لتطبيقات الويب.

  7. احفظوا معرّف العميل لاستخدامه لاحقًا في هذا الدليل السريع.

إنشاء مفتاح واجهة برمجة تطبيقات

  1. في Google Cloud Console، انتقِلوا إلى "القائمة" > واجهات برمجة التطبيقات والخدمات > بيانات الاعتماد.

    الانتقال إلى بيانات الاعتماد

  2. انقروا على إنشاء بيانات اعتماد > مفتاح واجهة برمجة تطبيقات.
  3. يظهر مفتاح واجهة برمجة التطبيقات الجديد.
    • انقروا على "نسخ" لنسخ مفتاح واجهة برمجة التطبيقات لاستخدامه في رمز تطبيقكم. يمكنكم أيضًا العثور على مفتاح واجهة برمجة التطبيقات في قسم "مفاتيح واجهة برمجة التطبيقات" ضمن بيانات اعتماد مشروعكم.
    • لمنع الاستخدام غير المصرّح به، ننصحكم بتقييد الأماكن وواجهات برمجة التطبيقات التي يمكن استخدام مفتاح واجهة برمجة التطبيقات لها. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة إضافة قيود على واجهة برمجة التطبيقات.

إعداد النموذج

  1. في دليل العمل، أنشئوا ملفًا باسم index.html.
  2. في الملف index.html، الصقوا رمزًا نموذجيًا:

    classroom/quickstart/index.html
    <!DOCTYPE html>
    <html>
      <head>
        <title>Classroom API Quickstart</title>
        <meta charset="utf-8" />
      </head>
      <body>
        <p>Classroom API Quickstart</p>
    
        <!--Add buttons to initiate auth sequence and sign out-->
        <button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
        <button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>
    
        <pre id="content" style="white-space: pre-wrap;"></pre>
    
        <script type="text/javascript">
          /* exported gapiLoaded */
          /* exported gisLoaded */
          /* exported handleAuthClick */
          /* exported handleSignoutClick */
    
          // TODO(developer): Set to client ID and API key from the Developer Console
          const CLIENT_ID = '<YOUR_CLIENT_ID>';
          const API_KEY = '<YOUR_API_KEY>';
    
          // Discovery doc URL for APIs used by the quickstart
          const DISCOVERY_DOC = 'https://classroom.googleapis.com/$discovery/rest';
    
          // Authorization scopes required by the API; multiple scopes can be
          // included, separated by spaces.
          const SCOPES = 'https://www.googleapis.com/auth/classroom.courses.readonly';
    
          let tokenClient;
          let gapiInited = false;
          let gisInited = false;
    
          document.getElementById('authorize_button').style.visibility = 'hidden';
          document.getElementById('signout_button').style.visibility = 'hidden';
    
          /**
           * Callback after api.js is loaded.
           */
          function gapiLoaded() {
            gapi.load('client', initializeGapiClient);
          }
    
          /**
           * Callback after the API client is loaded. Loads the
           * discovery doc to initialize the API.
           */
          async function initializeGapiClient() {
            await gapi.client.init({
              apiKey: API_KEY,
              discoveryDocs: [DISCOVERY_DOC],
            });
            gapiInited = true;
            maybeEnableButtons();
          }
    
          /**
           * Callback after Google Identity Services are loaded.
           */
          function gisLoaded() {
            tokenClient = google.accounts.oauth2.initTokenClient({
              client_id: CLIENT_ID,
              scope: SCOPES,
              callback: '', // defined later
            });
            gisInited = true;
            maybeEnableButtons();
          }
    
          /**
           * Enables user interaction after all libraries are loaded.
           */
          function maybeEnableButtons() {
            if (gapiInited && gisInited) {
              document.getElementById('authorize_button').style.visibility = 'visible';
            }
          }
    
          /**
           *  Sign in the user upon button click.
           */
          function handleAuthClick() {
            tokenClient.callback = async (resp) => {
              if (resp.error !== undefined) {
                throw (resp);
              }
              document.getElementById('signout_button').style.visibility = 'visible';
              document.getElementById('authorize_button').innerText = 'Refresh';
              await listCourses();
            };
    
            if (gapi.client.getToken() === null) {
              // Prompt the user to select a Google Account and ask for consent to share their data
              // when establishing a new session.
              tokenClient.requestAccessToken({prompt: 'consent'});
            } else {
              // Skip display of account chooser and consent dialog for an existing session.
              tokenClient.requestAccessToken({prompt: ''});
            }
          }
    
          /**
           *  Sign out the user upon button click.
           */
          function handleSignoutClick() {
            const token = gapi.client.getToken();
            if (token !== null) {
              google.accounts.oauth2.revoke(token.access_token);
              gapi.client.setToken('');
              document.getElementById('content').innerText = '';
              document.getElementById('authorize_button').innerText = 'Authorize';
              document.getElementById('signout_button').style.visibility = 'hidden';
            }
          }
    
          /**
           * Print the names of the first 10 courses the user has access to. If
           * no courses are found an appropriate message is printed.
           */
          async function listCourses() {
            let response;
            try {
              response = await gapi.client.classroom.courses.list({
                pageSize: 10,
              });
            } catch (err) {
              document.getElementById('content').innerText = err.message;
              return;
            }
    
            const courses = response.result.courses;
            if (!courses || courses.length == 0) {
              document.getElementById('content').innerText = 'No courses found.';
              return;
            }
            // Flatten to string to display
            const output = courses.reduce(
                (str, course) => `${str}${course.name}\n`,
                'Courses:\n');
            document.getElementById('content').innerText = output;
          }
        </script>
        <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
        <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>
      </body>
    </html>

    غيِّروا القيم في السلسلة على الشكل التالي:

تشغيل النموذج

  1. في دليل العمل، ثبِّتوا حزمة http-server:

    npm install http-server
    
  2. في دليل العمل، ابدأوا خادم ويب:

    npx http-server -p 8000
    
  1. في المتصفح، انتقِلوا إلى http://localhost:8000.
  2. سيظهر لكم طلب تفويض الوصول:
    1. إذا لم يسبق لكم تسجيل الدخول إلى حساب Google، سجِّلوا الدخول عند ظهور الطلب. إذا كنتم مسجّلين الدخول إلى حسابات متعددة، اختاروا حسابًا واحدًا لاستخدامه في التفويض.
    2. انقروا على حسنًا.

سيتم تشغيل تطبيق JavaScript واستدعاء Google Classroom API.

الخطوات التالية