Inhoud

Inleiding

Voorwaarden

Vereisten

Gebruikte componenten

Configureren

Script

Fouten

Problemen oplossen

Gerelateerde informatie

Spoiler (Markeren om te lezen)

Houd er rekening mee dat Cisco geen officiële ondersteuning biedt voor dit ontwikkelingsontwerp. Het is uitsluitend bedoeld als een voorbeeld om te begrijpen hoe de API met applicaties kan omgaan. Gebruikers moeten dit ontwerp alleen voor educatieve doeleinden gebruiken en niet als basis voor implementatie op productieniveau.  Het uitvoeren van de code die in dit artikel wordt gepresenteerd is op uw eigen risico, en Cisco wijst uitdrukkelijk elke aansprakelijkheid af voor problemen die voortvloeien uit het gebruik ervan.

Houd er rekening mee dat Cisco geen officiële ondersteuning biedt voor dit ontwikkelingsontwerp. Het is uitsluitend bedoeld als een voorbeeld om te begrijpen hoe de API met applicaties kan omgaan. Gebruikers moeten dit ontwerp alleen voor educatieve doeleinden gebruiken en niet als basis voor implementatie op productieniveau. Het uitvoeren van de code die in dit artikel wordt gepresenteerd is op uw eigen risico, en Cisco wijst uitdrukkelijk elke aansprakelijkheid af voor problemen die voortvloeien uit het gebruik ervan.

Inleiding

Dit document beschrijft hoe u alle mogelijke bewerkingen op Bestemmingslijsten kunt uitvoeren met Python en REST API.

Voorwaarden

Cisco raadt kennis van de volgende onderwerpen aan:

1. Python

2. REST API

3. Cisco beveiligde toegang

Vereisten

Aan deze eisen moet worden voldaan voordat verder kan worden gegaan:

- Cisco Secure Access-gebruikersaccount met de rol Full Adminuser

- Cisco Security Cloud Single Sign On-account (SCSO) om in te loggen op Secure Access.

- Maak uw Secure Access API-toetsen

Gebruikte componenten

De informatie in dit document is gebaseerd op de volgende software- en hardware-versies:

- Secure Access Dashboard

- Python 3.x

De informatie in dit document is gebaseerd op de apparaten in een specifieke laboratoriumomgeving. Alle apparaten die in dit document worden beschreven, hadden een opgeschoonde (standaard)configuratie. Als uw netwerk live is, moet u zorgen dat u de potentiële impact van elke opdracht begrijpt.

Configureren

Er zijn meerdere manieren om deze code te schrijven, rekening houdend met meerdere aspecten zoals Error Handling, token validiteit (3600 seconden), enzovoort.

Zorg er vriendelijk voor dat deze Python-bibliotheken zijn geïnstalleerd voordat u het script uitvoert:

pip install requests pip install oauthlib pip install requests_oauthlib

Script

Zorg er vriendelijk voor om het client_id en het client_secret te vervangen met uw API Key en Key Secret in dit script, respectievelijk.

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)

Uitvoer:

De output van dit script moet er zo uit zien:

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

Zodra dit programma succesvol is uitgevoerd, wordt aan het begin een vraag gesteld over de Cookie - Cookie Already Generated? (Y/N). De reden om deze vraag te stellen is om ervoor te zorgen dat u de cookie niet meerdere keren genereert omdat een cookie, eenmaal gegenereerd, 3600 seconden (1 uur) geldig is. Als u invoert y of Y, wordt er geen nieuwe cookie gegenereerd. Als u echter nof N invoert, wordt er een nieuwe cookie gegenereerd en opgeslagen in een lokaal tekstbestand in dezelfde map/map. De cookie van dit bestand wordt gebruikt in uw volgende verzoeken.

Fouten

U kunt deze fout tegenkomen als u een onjuiste ID invoert voor elke handeling die vereist dat u de Bestemmingslijst-ID vermeldt:

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

Als u tijdens het maken van een DestinationList de naam van DestinationList vermeldt die meer dan 255 tekens bevat, ziet u deze fout:

{'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'}

U kunt ook informatie opvragen over beleid, roamingcomputers, rapporten, enzovoort, met de Secure Access Developers Gebruikershandleiding.

Problemen oplossen

De Secure Access API-endpoints gebruiken HTTP-responscodes om aan te geven of een API-aanvraag is geslaagd of mislukt. Over het algemeen wijzen codes in het 2xx-bereik op succes, codes in het 4xx-bereik op een fout die het gevolg is van de verstrekte informatie, en codes in het 5xx-bereik geven serverfouten aan. De aanpak om het probleem op te lossen, zou afhangen van de responscode die wordt ontvangen:

REST API - Antwoordcodes 1

REST API - Antwoordcodes 2

Gerelateerde informatie

- Gebruikershandleiding voor Cisco Secure Access

- Cisco technische ondersteuning en downloads

- API-toetsen voor beveiligde toegang toevoegen

- Gebruikershandleiding Ontwikkelaars

- Secure Access-to-use REST API configureren met Python

- Bestemmingslijsten beheren via cURL