أخطاء التفويض

أثناء عملية التفويض، قد يعرض Google OAuth رسالة خطأ. استخدِم هذا الدليل لتحديد المشاكل الأكثر شيوعًا وحلّها أثناء هذه العملية.

تحديد المشاكل وحلّها

لمزيد من المعلومات حول Google OAuth، يُرجى الاطّلاع على استخدام بروتوكول OAuth 2.0 للدخول إلى واجهات Google APIs.

انتهاء صلاحية الرمز المميز لإعادة التحميل بشكل متكرر

قد تتوقّف رموز الدخول المميزة عن العمل بعد 7 أيام إذا لم تتم الموافقة على رقم تعريف العميل، وهذا أحد الأسباب المحتملة. لا يرتبط انتهاء صلاحية الرمز المميز بعد 7 أيام بموافقات Commercial أو Sandbox. يجب الموافقة على معرّف عميل OAuth 2.0 لحساب الخدمة أو حساب المستخدم وطرحه في مرحلة الإنتاج للحصول على فترات صلاحية أطول للرموز المميزة. يمكنك الاطّلاع على إعادة تحميل انتهاء صلاحية الرمز المميّز لمزيد من المعلومات.

تم رفض الوصول

إذا كنت قد أعددت شاشة طلب الموافقة على OAuth في Google Cloud وكان نوع المستخدم هو خارجي، سيظهر لك الخطأ "تم رفض الوصول" إذا حاولت ربط الحساب بحساب Google غير مُدرَج كمستخدم اختباري لتطبيقك. احرص على إضافة حساب Google إلى قسم المستخدمون التجريبيون في شاشة طلب الموافقة على OAuth.

خطأ في "إدارة إمكانية وصول الشركاء إلى الأجهزة الذكية"

للحصول على مساعدة بشأن أي أخطاء تواجهها عند الوصول إلى أداة PCM، يُرجى الاطّلاع على مرجع أخطاء أداة Partner Connections Manager (PCM).

لم تُثبت شركة Google ملكية هذا التطبيق

تستخدم واجهة برمجة التطبيقات SDM نطاقًا محدودًا، ما يعني أنّ أي تطبيقات تستخدم هذا النطاق أثناء التفويض ستكون "لم يتم التحقّق منها" ما لم يتم إكمال عملية التحقّق من واجهة برمجة تطبيقات OAuth. عند استخدام Device Access لأغراض شخصية، لا يلزم التحقّق من واجهة برمجة التطبيقات عبر OAuth.

قد تظهر لك شاشة "لم تتحقّق Google من هذا التطبيق" أثناء عملية التفويض، وتظهر هذه الشاشة إذا لم يتم ضبط نطاق sdm.service في شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth في Google Cloud. يمكن تجاوز هذه الشاشة من خلال النقر على الخيار خيارات متقدمة، ثم النقر على الانتقال إلى اسم المشروع (غير آمن).

يُرجى الاطّلاع على شاشة التطبيق الذي لم يتم التحقّق منه لمزيد من المعلومات.

عميل غير صالح

عند محاولة الحصول على رمز دخول أو رمز مميز لإعادة التحميل، سيظهر لك الخطأ "العميل غير صالح" إذا قدّمت سر عميل غير صحيح لبروتوكول OAuth 2.0. تأكَّد من أنّ قيمة client_secret التي تستخدمها في طلبات رموز الدخول والتحديث هي نفسها المخصّصة لمعرّف عميل OAuth 2.0 المستخدَم، كما هو موضّح في صفحة بيانات الاعتماد في Google Cloud.

طلب غير صالح، نطاق مطلوب غير متوفّر

بعد منح الأذونات في PCM، قد يظهر لك الخطأ "طلب غير صالح" مع الرسالة "المعلَمة المطلوبة غير متوفّرة: النطاق". تأكَّد من أنّ قيمة scope التي تستخدمها في طلبات التفويض هي نفسها القيمة التي ضبطتها لعميل OAuth 2.0، كما هو موضّح في صفحة بيانات الاعتماد في Google Cloud.

عدم تطابق معرّف الموارد المنتظم (URI) الخاص بإعادة التوجيه

عند إجراء عملية التفويض، قد تواجه الخطأ "Redirect uri mismatch". تأكَّد من أنّ قيمة redirect_uri التي تستخدمها في طلبات التفويض هي نفسها القيمة التي ضبطتها لعميل OAuth 2.0، كما هو موضّح في صفحة بيانات الاعتماد في Google Cloud.

مرجع سريع

استخدِم هذا المرجع لتنفيذ خطوات تفويضuser وربط حسابها على Google بسرعة.

لاستخدام هذا المرجع السريع، عدِّل كل متغيّر عنصر نائب في نماذج الرموز باستخدام قيم عملية الدمج المحدّدة، ثم انسخها والصقها حسب الحاجة:

‫1 PCM

وجِّه user إلى رابط PCM في تطبيقك، مع استبدال ما يلي:

  1. project-id باستخدام Device Access Project معرّفك
  2. oauth2-client-id مع معرّف عميل OAuth2 من بيانات اعتماد Google Cloud
  3. redirect-uri مع تحديد معرّف الموارد المنتظم لإعادة التوجيه لمعرّف عميل OAuth2 الذي تستخدمه
  4. scope مع أحد نطاقاتك المتاحة
https://nestservices.google.com/partnerconnections/project-id/auth?redirect_uri=redirect-uri&access_type=offline&prompt=consent&client_id=oauth2-client-id&response_type=code&scope=https://www.googleapis.com/auth/scope

2 Auth Code

بعد منح الأذونات من خلال PCM للنطاق الذي اخترته، يجب إعادة توجيه user إلى معرّف الموارد المنتظم (URI) الذي حدّدته لإعادة التوجيه. يتم عرض رمز التفويض كالمَعلمة code في عنوان URL، ويجب أن يكون بالتنسيق التالي:

redirect-uri?code=authorization-code&scope=https://www.googleapis.com/auth/scope

‫3 Access Token

استخدِم رمز التفويض لاسترداد رمز دخول يمكنك استخدامه لاستدعاء واجهة برمجة تطبيقات SDM نيابةً عن المستخدم.

أرسِل طلب POST إلى نقطة نهاية OAuth من Google، مع استبدال ما يلي:

  1. oauth2-client-id وoauth2-client-secret باستخدام معرّف العميل وسر العميل في OAuth2 من بيانات اعتماد Google Cloud
  2. authorization-code مع الرمز الذي تلقّيته في الخطوة السابقة
  3. redirect-uri مع تحديد معرّف الموارد المنتظم لإعادة التوجيه لمعرّف عميل OAuth2 الذي تستخدمه

تعرض خدمة Google OAuth رمزين مميزين، أحدهما للدخول والآخر لإعادة التحميل.

طلب

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&code=authorization-code&grant_type=authorization_code&redirect_uri=redirect-uri'

الردّ

{
  "access_token": "access-token",
  "expires_in": 3599,
  "refresh_token": "refresh-token",
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}

‫4 طلب بيانات من واجهة برمجة التطبيقات

لن يكتمل التفويض إلا بعد إجراء طلب إلى واجهة برمجة التطبيقات باستخدام رمز الدخول الخاص بـ user. تُنهي هذه المكالمة الأولية عملية التفويض وتفعّل الأحداث.

يجب استخدام أحد طلبات البيانات من واجهة برمجة التطبيقات المدرَجة للنطاق المحدّد لإكمال عملية التفويض.

sdm.service

الأجهزة

لمزيد من المعلومات، راجِع devices.list مرجع واجهة برمجة التطبيقات.

curl -X GET 'https://smartdevicemanagement.googleapis.com/v1/enterprises/project-id/devices' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer access-token'

‫5 Refresh Token

تكون رموز الدخول إلى واجهة برمجة التطبيقات لمجموعة أدوات SDM صالحة لمدة ساعة واحدة فقط، كما هو موضّح في المَعلمة expires_in التي يعرضها بروتوكول Google OAuth. إذا انتهت صلاحية رمز الدخول، استخدِم رمز التحديث للحصول على رمز جديد.

أرسِل طلب POST إلى نقطة نهاية OAuth من Google، مع استبدال ما يلي:

  1. oauth2-client-id وoauth2-client-secret باستخدام معرّف العميل وسر العميل في OAuth2 من بيانات اعتماد Google Cloud
  2. refresh-token باستخدام الرمز الذي تلقّيته عند الحصول على رمز الدخول في البداية.

يعرض Google OAuth رمز دخول جديدًا.

طلب

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&refresh_token=refresh-token&grant_type=refresh_token'

الردّ

{
  "access_token": "new-access-token",
  "expires_in": 3599,
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}