14. البنية التحتية للمصادقة

تلميح

تحتاج مقتطفات الشيفرة في هذه الصفحة إلى الاستيرادات التالية إذا كنت خارج وحدة تحكم pyqgis:

 1from qgis.core import (
 2  QgsApplication,
 3  QgsRasterLayer,
 4  QgsAuthMethodConfig,
 5  QgsDataSourceUri,
 6  QgsPkiBundle,
 7  QgsMessageLog,
 8)
 9
10from qgis.gui import (
11    QgsAuthAuthoritiesEditor,
12    QgsAuthConfigEditor,
13    QgsAuthConfigSelect,
14    QgsAuthSettingsWidget,
15)
16
17from qgis.PyQt.QtWidgets import (
18    QWidget,
19    QTabWidget,
20)
21
22from qgis.PyQt.QtNetwork import QSslCertificate

14.1. المقدمة

يمكن قراءة المرجع الخاص بالمستخدم للبنية التحتية للمصادقة في دليل المستخدم ضمن فقرة نظرة عامة على نظام المصادقة.

يصف هذا الفصل أفضل الممارسات لاستخدام نظام المصادقة من منظور المطوّر.

يُستخدم نظام المصادقة على نطاق واسع في QGIS Desktop من قِبل مزوّدي البيانات كلما تطلّب الوصول إلى مورد معيّن بيانات اعتماد، على سبيل المثال عندما تُنشئ طبقة اتصالًا بقاعدة بيانات Postgres.

توجد أيضًا بعض عناصر الواجهة في مكتبة gui الخاصة بـ QGIS يمكن لمطوّري الإضافات استخدامها لدمج البنية التحتية للمصادقة في شيفرتهم بسهولة:

  • QgsAuthConfigEditor

  • QgsAuthConfigSelect

  • QgsAuthSettingsWidget

يمكن الاطلاع على مرجع جيد للشيفرة في tests code الخاصة بالبنية التحتية للمصادقة.

تحذير

بسبب القيود الأمنية التي أُخذت في الحسبان أثناء تصميم البنية التحتية للمصادقة، لا يُتاح لـ Python إلا جزء مختار من الدوال الداخلية.

14.2. المصطلحات

فيما يلي تعريفات لأكثر الكائنات شيوعًا التي يتناولها هذا الفصل.

كلمة المرور الرئيسية

كلمة مرور تتيح الوصول إلى بيانات الاعتماد المخزّنة في قاعدة بيانات المصادقة في QGIS وفك تشفيرها

قاعدة بيانات المصادقة

قاعدة بيانات SQLite باسم qgis-auth.db مشفّرة بـ Master Password تُخزَّن فيها Authentication Configuration، مثل اسم المستخدم/كلمة المرور، والشهادات والمفاتيح الشخصية، وجهات إصدار الشهادات

قاعدة بيانات المصادقة (Authentication DB)

Authentication Database

إعداد المصادقة

مجموعة من بيانات المصادقة تعتمد على Authentication Method. فمثلًا تخزّن طريقة المصادقة الأساسية (Basic) زوج اسم المستخدم/كلمة المرور.

إعداد المصادقة (Authentication Config)

Authentication Configuration

طريقة المصادقة

طريقة محددة تُستخدم لإتمام المصادقة. لكل طريقة بروتوكولها الخاص المستخدم للحصول على مستوى المصادقة. وتُنفَّذ كل طريقة على هيئة مكتبة مشتركة تُحمَّل ديناميكيًا أثناء تهيئة البنية التحتية للمصادقة في QGIS.

14.3. QgsAuthManager نقطة الدخول

يُعدّ الكائن الوحيد (singleton) QgsAuthManager نقطة الدخول لاستخدام بيانات الاعتماد المخزّنة في Authentication DB المشفّرة في QGIS، أي الملف qgis-auth.db الموجود في مجلد ملف تعريف المستخدم النشط.

يتولى هذا الصنف التفاعل مع المستخدم: إما بطلب تعيين كلمة مرور رئيسية أو باستخدامها بشفافية للوصول إلى المعلومات المخزّنة المشفّرة.

14.3.1. تهيئة المدير وتعيين كلمة المرور الرئيسية

يقدّم المقتطف التالي مثالًا على تعيين كلمة المرور الرئيسية لفتح الوصول إلى إعدادات المصادقة. التعليقات في الشيفرة مهمة لفهم المقتطف.

 1authMgr = QgsApplication.authManager()
 2
 3# check if QgsAuthManager has already been initialized... a side effect
 4# of the QgsAuthManager.init() is that AuthDbPath is set.
 5# QgsAuthManager.init() is executed during QGIS application init and hence
 6# you do not normally need to call it directly.
 7if authMgr.authenticationDatabasePath():
 8    # already initialized => we are inside a QGIS app.
 9    if authMgr.masterPasswordIsSet():
10        msg = 'Authentication master password not recognized'
11        assert authMgr.masterPasswordSame("your master password"), msg
12    else:
13        msg = 'Master password could not be set'
14        # The verify parameter checks if the hash of the password was
15        # already saved in the authentication db
16        assert authMgr.setMasterPassword("your master password",
17                                          verify=True), msg
18else:
19    # outside qgis, e.g. in a testing environment => setup env var before
20    # db init
21    os.environ['QGIS_AUTH_DB_DIR_PATH'] = "/path/where/located/qgis-auth.db"
22    msg = 'Master password could not be set'
23    assert authMgr.setMasterPassword("your master password", True), msg
24    authMgr.init("/path/where/located/qgis-auth.db")

14.3.2. إضافة مُدخل جديد لإعداد المصادقة إلى authdb

كل بيانات اعتماد مخزّنة هي نسخة من Authentication Configuration من الصنف QgsAuthMethodConfig، ويُوصَل إليها باستخدام سلسلة نصية فريدة مثل السلسلة التالية:

authcfg = 'fm1s770'

تُولَّد هذه السلسلة تلقائيًا عند إنشاء مُدخل باستخدام QGIS API أو الواجهة الرسومية، لكن قد يكون من المفيد تعيينها يدويًا إلى قيمة معروفة إذا كان يجب مشاركة الإعداد (ببيانات اعتماد مختلفة) بين عدة مستخدمين داخل مؤسسة.

يُعدّ QgsAuthMethodConfig الصنف الأساسي لأي Authentication Method. تعيّن كل طريقة مصادقة خريطة تجزئة (hash map) للإعداد تُخزَّن فيها معلومات المصادقة. فيما يلي مقتطف مفيد لتخزين بيانات اعتماد PKI-path لمستخدم افتراضي اسمه alice:

 1authMgr = QgsApplication.authManager()
 2# set alice PKI data
 3config = QgsAuthMethodConfig()
 4config.setName("alice")
 5config.setMethod("PKI-Paths")
 6config.setUri("https://example.com")
 7config.setConfig("certpath", "path/to/alice-cert.pem" )
 8config.setConfig("keypath", "path/to/alice-key.pem" )
 9# check if method parameters are correctly set
10assert config.isValid()
11
12# register alice data in authdb returning the ``authcfg`` of the stored
13# configuration
14authMgr.storeAuthenticationConfig(config)
15newAuthCfgId = config.id()
16assert newAuthCfgId

14.3.2.1. طرق المصادقة المتاحة

تُحمَّل مكتبات Authentication Method ديناميكيًا أثناء تهيئة مدير المصادقة. طرق المصادقة المتاحة هي:

الطريقة

وصف

المزوّدون المستهدفون

Basic

المصادقة باسم المستخدم وكلمة المرور

postgres، oracle، ows، wfs، wcs، wms، ogr، gdal، proxy

APIHeader

ترويسات HTTP

ows، wfs، wcs، wms

AWSS3

خدمة التخزين البسيط AWS Simple Storage Service

awss3

EsriToken

مصادقة ESRI المعتمدة على الرموز المميزة (token) لخوادم ArcGIS REST

arcgismapserver, arcgisfeatureserver

Identity-Cert

المصادقة بشهادة الهوية

ows، wfs، wcs، wms، postgres

MapTilerHmacSha256

مصادقة MapTiler HMAC-SHA256

wms، vectortile، xyzvectortiles

OAuth2

مصادقة OAuth2

ows، wfs، wcs، wms

PKI-Paths

المصادقة بمسارات PKI

ows، wfs، wcs، wms، postgres

PKI-PKCS#12

مصادقة PKI PKCS#12

ows، wfs، wcs، wms، postgres

14.3.2.2. إضافة جهات إصدار الشهادات

1authMgr = QgsApplication.authManager()
2# add authorities
3cacerts = QSslCertificate.fromPath( "/path/to/ca_chains.pem" )
4assert cacerts is not None
5# store CA
6authMgr.storeCertAuthorities(cacerts)
7# and rebuild CA caches
8authMgr.rebuildCaCertsCache()
9authMgr.rebuildTrustedCaCertsCache()

14.3.2.3. إدارة حزم PKI باستخدام QgsPkiBundle

الصنف QgsPkiBundle صنف مساعد لتجميع حزم PKI المكوّنة من SslCert وSslKey وسلسلة جهات الإصدار (CA). فيما يلي مقتطف للحصول على حزمة محمية بكلمة مرور:

1# add alice cert in case of key with pwd
2caBundlesList = []  # List of CA bundles
3bundle = QgsPkiBundle.fromPemPaths( "/path/to/alice-cert.pem",
4                                     "/path/to/alice-key_w-pass.pem",
5                                     "unlock_pwd",
6                                     caBundlesList )
7assert bundle is not None
8# You can check bundle validity by calling:
9# bundle.isValid()

راجع توثيق الصنف QgsPkiBundle لاستخراج الشهادة/المفتاح/جهات الإصدار من الحزمة.

14.3.3. حذف مُدخل من authdb

يمكننا حذف مُدخل من Authentication Database باستخدام مُعرّفه authcfg عبر المقتطف التالي:

authMgr = QgsApplication.authManager()
authMgr.removeAuthenticationConfig( "authCfg_Id_to_remove" )

14.3.4. ترك توسيع authcfg لـ QgsAuthManager

أفضل طريقة لاستخدام Authentication Config المخزّن في Authentication DB هي الإشارة إليه بالمعرّف الفريد authcfg. ويعني التوسيع تحويله من معرّف إلى مجموعة كاملة من بيانات الاعتماد. وأفضل ممارسة لاستخدام Authentication Configs المخزّنة هي تركها تُدار تلقائيًا بواسطة مدير المصادقة. والاستخدام الشائع للإعداد المخزّن هو الاتصال بخدمة تتطلب المصادقة مثل WMS أو WFS أو باتصال قاعدة بيانات.

ملاحظة

خذ في الحسبان أن ليس كل مزوّدي البيانات في QGIS مدمجين مع البنية التحتية للمصادقة. فكل طريقة مصادقة مشتقة من الصنف الأساسي QgsAuthMethod تدعم مجموعة مختلفة من المزوّدين. على سبيل المثال، تدعم الدالة certIdentity() قائمة المزوّدين التالية:

authM = QgsApplication.authManager()
print(authM.authMethod("Identity-Cert").supportedDataProviders())

مثال على المخرجات:

['ows', 'wfs', 'wcs', 'wms', 'postgres']

على سبيل المثال، للوصول إلى خدمة WMS باستخدام بيانات اعتماد مخزّنة معرّفة بـ authcfg = 'fm1s770'، يكفي أن نستخدم authcfg في عنوان URL لمصدر البيانات كما في المقتطف التالي:

 1authCfg = 'fm1s770'
 2quri = QgsDataSourceUri()
 3quri.setParam("layers", 'usa:states')
 4quri.setParam("styles", '')
 5quri.setParam("format", 'image/png')
 6quri.setParam("crs", 'EPSG:4326')
 7quri.setParam("dpiMode", '7')
 8quri.setParam("featureCount", '10')
 9quri.setParam("authcfg", authCfg)   # <---- here my authCfg url parameter
10quri.setParam("contextualWMSLegend", '0')
11quri.setParam("url", 'https://my_auth_enabled_server_ip/wms')
12rlayer = QgsRasterLayer(str(quri.encodedUri(), "utf-8"), 'states', 'wms')

في الحالة أعلاه، سيتولى المزوّد wms توسيع المعامل authcfg في URI ببيانات الاعتماد قبل إنشاء اتصال HTTP مباشرةً.

تحذير

ينبغي للمطوّر أن يترك توسيع authcfg للصنف QgsAuthManager، وبذلك يضمن ألا يتم التوسيع مبكرًا أكثر من اللازم.

عادةً تُستخدم سلسلة URI مبنية باستخدام الصنف QgsDataSourceURI لتعيين مصدر بيانات بالطريقة التالية:

authCfg = 'fm1s770'
quri = QgsDataSourceUri("my WMS uri here")
quri.setParam("authcfg", authCfg)
rlayer = QgsRasterLayer( quri.uri(False), 'states', 'wms')

ملاحظة

المعامل False مهم لتجنّب التوسيع الكامل لمعرّف authcfg الموجود في URI.

14.3.4.1. أمثلة PKI مع مزوّدي بيانات آخرين

يمكن قراءة أمثلة أخرى مباشرة في اختبارات QGIS الأصلية مثل test_authmanager_pki_ows أو test_authmanager_pki_postgres.

14.4. تكييف الإضافات لاستخدام البنية التحتية للمصادقة

تستخدم كثير من إضافات الطرف الثالث httplib2 أو مكتبات شبكات أخرى في Python لإدارة اتصالات HTTP بدلًا من التكامل مع QgsNetworkAccessManager وما يرتبط به من تكامل مع البنية التحتية للمصادقة.

لتسهيل هذا التكامل أُنشئت دالة Python مساعدة تُسمى NetworkAccessManager. يمكن العثور على شيفرتها هنا.

يمكن استخدام هذا الصنف المساعد كما في المقتطف التالي:

1http = NetworkAccessManager(authid="my_authCfg", exception_class=My_FailedRequestError)
2try:
3  response, content = http.request( "my_rest_url" )
4except My_FailedRequestError, e:
5  # Handle exception
6  pass

14.5. واجهات المصادقة الرسومية

تُسرد في هذه الفقرة الواجهات الرسومية المتاحة المفيدة لدمج البنية التحتية للمصادقة في واجهات مخصّصة.

14.5.1. واجهة رسومية لاختيار بيانات الاعتماد

إذا كان من الضروري اختيار Authentication Configuration من المجموعة المخزّنة في Authentication DB فإن ذلك متاح في صنف الواجهة الرسومية QgsAuthConfigSelect.

../../_images/QgsAuthConfigSelect.png

ويمكن استخدامه كما في المقتطف التالي:

1# create the instance of the QgsAuthConfigSelect GUI hierarchically linked to
2# the widget referred with `parent`
3parent = QWidget()  # Your GUI parent widget
4gui = QgsAuthConfigSelect( parent, "postgres" )
5# add the above created gui in a new tab of the interface where the
6# GUI has to be integrated
7tabGui = QTabWidget()
8tabGui.insertTab( 1, gui, "Configurations" )

المثال أعلاه مأخوذ من code المصدرية لـ QGIS. يشير المعامل الثاني لمُنشئ الواجهة الرسومية إلى نوع مزوّد البيانات، ويُستخدم لتقييد Authentication Methods المتوافقة مع المزوّد المحدد.

14.5.2. واجهة محرّر المصادقة

الواجهة الرسومية الكاملة المستخدمة لإدارة بيانات الاعتماد وجهات الإصدار وللوصول إلى أدوات المصادقة يديرها الصنف QgsAuthEditorWidgets.

../../_images/QgsAuthEditorWidgets.png

ويمكن استخدامه كما في المقتطف التالي:

1# create the instance of the QgsAuthEditorWidgets GUI hierarchically linked to
2# the widget referred with `parent`
3parent = QWidget()  # Your GUI parent widget
4gui = QgsAuthConfigSelect( parent )
5gui.show()

يمكن العثور على مثال متكامل في test ذي الصلة.

14.5.3. واجهة محرّر جهات الإصدار

واجهة رسومية تُستخدم لإدارة جهات الإصدار فقط يديرها الصنف QgsAuthAuthoritiesEditor.

../../_images/QgsAuthAuthoritiesEditor.png

ويمكن استخدامه كما في المقتطف التالي:

1# create the instance of the QgsAuthAuthoritiesEditor GUI hierarchically
2#  linked to the widget referred with `parent`
3parent = QWidget()  # Your GUI parent widget
4gui = QgsAuthAuthoritiesEditor( parent )
5gui.show()