المحتويات

المقدمة

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

المتطلبات

المكونات المستخدمة

التكوين

نص

الأخطاء

استكشاف الأخطاء وإصلاحها

معلومات ذات صلة

مفسد (إبراز إلى القراءة)

يرجى التنويه بأن Cisco لا توفر الدعم الرسمي لتصميم التطوير هذا. والغرض من هذا المستند هو فقط كمثال مرجعي لتسهيل فهم كيفية تفاعل واجهة برمجة التطبيقات مع التطبيقات. يجب على المستخدمين إستخدام هذا التصميم لأغراض تعليمية فقط وليس كأساس للتنفيذ على مستوى الإنتاج.  يكون تنفيذ الرمز المقدم في هذه المادة على مسؤوليتك الخاصة، وتتنصل Cisco صراحة من أي مسؤولية تتعلق بأي مسائل تنشأ عن إستخدامه.

يرجى التنويه بأن Cisco لا توفر الدعم الرسمي لتصميم التطوير هذا. والغرض من هذا المستند هو فقط كمثال مرجعي لتسهيل فهم كيفية تفاعل واجهة برمجة التطبيقات مع التطبيقات. يجب على المستخدمين إستخدام هذا التصميم لأغراض تعليمية فقط وليس كأساس للتنفيذ على مستوى الإنتاج. يكون تنفيذ الرمز المقدم في هذه المادة على مسؤوليتك الخاصة، وتتنصل Cisco صراحة من أي مسؤولية تتعلق بأي مسائل تنشأ عن إستخدامه.

المقدمة

يوضح هذا المستند كيفية تنفيذ جميع العمليات الممكنة على قوائم الوجهة باستخدام Python و REST API.

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

توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:

1. بايثون

2. واجهة برمجة تطبيقات REST

3. Cisco Secure Access

المتطلبات

ويجب استيفاء هذه المتطلبات قبل المضي قدما:

- حساب مستخدم Cisco Secure Access مع دور AdminUser الكامل.

- حساب تسجيل الدخول الأحادي (SCSO) لسحابة أمان Cisco لتسجيل الدخول لتأمين الوصول.

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

المكونات المستخدمة

تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:

- لوحة معلومات الوصول الآمن

- بايثون 3.x

تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.

التكوين

هناك طرق متعددة لكتابة هذا الرمز مع مراعاة جوانب متعددة مثل معالجة الخطأ، صحة الرمز المميز (3600 ثانية)، وهكذا.

الرجاء التأكد من تثبيت مكتبات Python هذه قبل تشغيل البرنامج النصي:

pip install requests pip install oauthlib pip install requests_oauthlib

نص

يرجى التأكد من إستبدال client_id وclient_secret API KeyKey Secret و في هذا النص، على التوالي.

from oauthlib.oauth2 import BackendApplicationClient from oauthlib.oauth2 import TokenExpiredError from requests_oauthlib import OAuth2Session from requests.auth import HTTPBasicAuth import time import requests import pprint import json def fetch_headers(BToken): BT = f"Bearer {BToken}" headers = { 'Authorization':BT, "Content-Type": "application/json", "Accept": "application/json" } return headers # GET OAUTH 2.0 TOKEN def getToken(): token_url = 'https://api.sse.cisco.com/auth/v2/token' try: #ASSIGN your API Key to the variable client_id and Secret Key to the variable client_secret client_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" client_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" auth = HTTPBasicAuth(client_id, client_secret) client = BackendApplicationClient(client_id=client_id) oauth = OAuth2Session(client=client) token = oauth.fetch_token(token_url=token_url, auth=auth) print("\n######Token Generated Successfully######\n") return token except e as Exception: print(f"Encountered an error while Fetching the TOKEN :: {e}") # 1 - GET DESTINATION LISTS def fetch_destinationlists(h): url = "https://api.sse.cisco.com/policies/v2/destinationlists" try: response = requests.request('GET', url, headers=h) json_object = json.loads(response.content) #pprint.pprint(json_object) x=1 for item in json_object["data"]: print(f"Destination List : {x}") pprint.pprint(f"Name : {item['name']}") pprint.pprint(f"ID : {item['id']}") #pprint.pprint(f"Destination Count : {item['meta']['destinationCount']}") print("\n") x+=1 except e as Exception: print(f"Encountered an Error while Fetching the Destination Lists :: {e}") # 2 - GET DESTINATION LIST def get_destinationlist(h): try: choice = input("Enter the ID of the DestinationList:: ") url = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice response = requests.request('GET', url, headers=h) json_object = json.loads(response.content) print("\n\n") pprint.pprint(json_object) print("\n\n") except e as Exception: print(f"Encountered an Error while Fetching the Destination List Details :: {e}") # 3 - CREATE DESTINATION LIST def create_destinationlist(h): url = "https://api.sse.cisco.com/policies/v2/destinationlists" try: naav = input("Name of the DestinationList :: ") payload = { "access": "none", "isGlobal": False, "name": naav, } response = requests.request('POST', url, headers=h, data = json.dumps(payload)) json_object = json.loads(response.content) print("\n\n") pprint.pprint(json_object) print("\n\n") except e as Exception: print(f"Encountered an Error while Creating the Destination List :: {e}") # 4 - UPDATE DESTINATION LIST NAME def patch_destinationlist(h): try: choice = input("Enter the ID of the DestinationList for changing it's name :: ") url = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice naav = input("Enter New Name :: ") payload = {"name": naav} response = requests.request('PATCH', url, headers=h, data = json.dumps(payload)) json_object = json.loads(response.content) print("\n\n") pprint.pprint(json_object) print("\n\n") except e as Exception: print(f"Encountered an Error while Updating the Destination List :: {e}") # 5 - DELETE DESTINATION LIST def delete_destinationlist(h): try: choice = input("Enter the ID of the DestinationList for DELETION :: ") url = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice response = requests.request('DELETE', url, headers=h) json_object = json.loads(response.content) print("\n\n") pprint.pprint(json_object) print("\n\n") except Exception as e: print(f"Encountered an Error while Deleting the Destination List :: {e}") # 6 - GET DESTINATIONS FROM A DESTINATION LIST def fetch_detail(h): try: choice = input("DestinationList ID: ") url2 = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice + "/destinations" response = requests.request('GET', url2, headers=h) print("\n") json_dest = json.loads(response.content) pprint.pprint(json_dest) print("\n\n") except e as Exception: print(f"Encountered an Error while Fetching the Destinations from the Destination List :: {e}") # 7 - ADD DESTINATIONS TO A DESTINATION LIST def add_destinations(h): try: choice = input("Enter the ID of the DestinationList :: ") url = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice + "/destinations" destination_to_add = input("\nEnter the destination that you want to add :: ") payload = [{"destination": destination_to_add}] response = requests.request('POST', url, headers=h, data = json.dumps(payload)) print("\n") json_dest = json.loads(response.content) pprint.pprint(json_dest) print("\n\n") except e as Exception: print(f"Encountered an Error while Adding the Destination to the Destination List :: {e}") # 8 - DELETE DESTINATIONS FROM DESTINATION LIST def delete_entry(h): try: choice_del = input("\nCONFIRM DestinationList ID from which you want to delete the Destination :: ") url3 = "https://api.sse.cisco.com/policies/v2/destinationlists/" + choice_del + "/destinations/remove" dest = int(input("ID of the Destination that you want to remove: ")) payload = f"[{dest}]" response = requests.request('DELETE', url3, headers=h, data=payload) json_del = json.loads(response.content) print("\n\n") pprint.pprint(json_del) print("\n\n") except e as Exception: print(f"Encountered an Error while Deleting a Destination from the Destination List :: {e}") #FETCH COOKIE possess_cookie = " " while possess_cookie not in ["Y","y","N","n"]: possess_cookie = input("Token Already Generated? (Y/N) :: ") if possess_cookie.upper() =="N": cook = getToken() with open("cookie.txt","w") as wr: wr.writelines(cook["access_token"]) # print(f"Access Token = {cook["access_token"]}") #FETCH HEADERS with open("cookie.txt","r") as ree: h = fetch_headers(ree.readline()) print("\n") while True: action = input("""Available operations: 1. Get Destination Lists 2. Get Destination List 3. Create Destination List 4. Update Destination List Name 5. Delete Destination List 6. Get Destinations from Destination List 7. Add Destinations to a Destination List 8. Delete Destinations from Destination List 9. Exit Enter Your Choice :: """) print("\n") operation = action.replace(" ","") if operation == "1": fetch_destinationlists(h) elif operation == "2": fetch_destinationlists(h) get_destinationlist(h) elif operation == "3": create_destinationlist(h) elif operation == "4": fetch_destinationlists(h) patch_destinationlist(h) elif operation == "5": fetch_destinationlists(h) delete_destinationlist(h) elif operation == "6": fetch_destinationlists(h) fetch_detail(h) elif operation == "7": fetch_destinationlists(h) add_destinations(h) elif operation == "8": fetch_destinationlists(h) fetch_detail(h) delete_entry(h) elif operation == "9": break else: print("\n") print("==========INCORRECT INPUT==========") print("\n") print("Thank You!!! Good Bye!!!") time.sleep(5)

الناتج:

يجب أن تبدو مخرجات هذا النص التنفيذي بهذا الشكل:

Cookie Already Generated? (Y/N) :: y Available operations: 1. Get Destination Lists 2. Get Destination List 3. Create Destination List 4. Update Destination List Name 5. Delete Destination List 6. Get Destinations from Destination List 7. Add Destinations to a Destination List 8. Delete Destinations from Destination List 9. Exit Enter Your Choice ::

Token Already Generated? (Y/N) :: y Available operations: 1. Get Destination Lists 2. Get Destination List 3. Create Destination List 4. Update Destination List Name 5. Delete Destination List 6. Get Destinations from Destination List 7. Add Destinations to a Destination List 8. Delete Destinations from Destination List 9. Exit Enter Your Choice :: 1

بمجرد تنفيذ هذا البرنامج بنجاح، يتم طرح سؤال في البداية حول ملف تعريف الارتباط - Cookie Already Generated? (Y/N). السبب وراء طرح هذا السؤال هو التأكد من عدم إنشاء ملف تعريف الارتباط عدة مرات لأن ملف تعريف الارتباط، بمجرد إنشاؤه، صالح لمدة 3600 ثانية (ساعة واحدة). إذا قمت بإدخال y أو Y، فلن يتم إنشاء ملف تعريف إرتباط جديد. ومع ذلك، إذا قمت بإدخال nأو N، يتم إنشاء ملف تعريف إرتباط جديد وحفظه في ملف نصي محلي في نفس الدليل/المجلد. يتم إستخدام ملف تعريف الارتباط من هذا الملف في الطلبات التالية.

الأخطاء

يمكنك مواجهة هذا الخطأ إذا قمت بإدخال معرف غير صحيح لأي عملية تتطلب منك ذكر معرف DestinationList:

{'message': 'no Route matched with those values'}

أثناء إنشاء DestinationList، إذا ذكرت اسم DestinationList الذي يتجاوز 255 حرف، سترى هذا الخطأ:

{'code': 400, 'code_text': 'Bad Request', 'error': 'invalid_request', 'message': {'name': {'code': 'string_invalid', 'code_text': 'must be fewer than 255 characters long'}}, 'statusCode': 400, 'txId': 'l23f0cjk62fe'}

كما يمكنك إحضار معلومات حول السياسات وأجهزة الكمبيوتر المتجولة والتقارير، وما إلى ذلك، باستخدام دليل مستخدم Secure Access Developer.

استكشاف الأخطاء وإصلاحها

تستخدم نقاط النهاية ل Secure Access API رموز إستجابة HTTP للإشارة إلى نجاح طلب API أو فشله. بشكل عام، تشير الرموز الموجودة في نطاق 2xx إلى النجاح، وتشير الرموز الموجودة في نطاق 4xx إلى خطأ نتج عن المعلومات المتوفرة، وتشير الرموز الموجودة في نطاق 5xx إلى أخطاء في الخادم. يعتمد النهج المتبع لحل هذه المسألة على رمز الاستجابة الذي يتم تلقيه:

REST API - رموز الاستجابة 1

REST API - رمز الاستجابة 2

معلومات ذات صلة

- دليل مستخدم Cisco Secure Access

- الدعم الفني والتنزيلات من Cisco

- إضافة مفاتيح واجهة برمجة تطبيقات الوصول الآمن

- دليل مستخدم المطورين

- تكوين الوصول الآمن لاستخدام REST API مع Python

- إدارة قوائم الوجهة عبر cURL