Skip to content
Snippets Groups Projects
Commit 0bad1aa1 authored by JorgeEcheva26's avatar JorgeEcheva26
Browse files

sdk_v0.1

parent 689a0b75
No related branches found
No related tags found
1 merge request!1Sdk v0.1 (#1)
Showing
with 900 additions and 0 deletions
{
"invoker_folder": "",
"provider_folder": "",
"capif_host": "",
"register_host": "",
"capif_https_port": "",
"capif_register_port": "",
"capif_callback_url": "",
"csr_common_name": "",
"csr_organizational_unit": "",
"csr_organization": "",
"crs_locality": "",
"csr_state_or_province_name": "",
"csr_country_name": "",
"csr_email_address": "",
"capif_username": "",
"capif_password": "",
"APFs":"",
"AEFs":"",
"debug_mode": ""
}
{
"api-name": "",
"api-version": "",
"comm-type": "",
"protocol": "",
"aef-id": "",
"data-format": "",
"api-cat": "",
"preferred-aef-loc": "",
"req-api-prov-name": "",
"supported-features": "",
"api-supported-features": "",
"ue-ip-addr": "",
"service-kpis": ""
}
{
"serviceApiId":"",
"publisherAPFid":"",
"publisherAEFsids":["","",""]
}
\ No newline at end of file
{
"register_host": "",
"capif_register_port": "",
"capif_register_username": "",
"capif_register_password": "",
"capif_username":"",
"capif_password":"",
"config_path":"",
"uuid":""
}
\ No newline at end of file
{
"apiName": "Api-de-prueba-2",
"aefProfiles": [
{
"aefId": "",
"versions": [
{
"apiVersion": "v1",
"expiry": "2100-11-30T10:32:02.004Z",
"resources": [
{
"resourceName": "MONITORING_SUBSCRIPTIONS",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/{scsAsId}/subscriptions",
"custOpName": "http_post",
"operations": [
"GET",
"POST"
],
"description": "Endpoint to manage monitoring subscriptions"
},
{
"resourceName": "MONITORING_SUBSCRIPTION_SINGLE",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/{scsAsId}/subscriptions/{subscriptionId}",
"custOpName": "http_get",
"operations": [
"GET",
"PUT",
"DELETE"
],
"description": "Endpoint to manage single subscription"
}
],
"custOperations": [
{
"commType": "REQUEST_RESPONSE",
"custOpName": "string",
"operations": [
"POST"
],
"description": "string"
}
]
}
],
"protocol": "HTTP_1_1",
"dataFormat": "JSON",
"securityMethods": [
"Oauth",
"PSK"
],
"interfaceDescriptions": [
{
"ipv4Addr": "127.0.0.1",
"port": 8888,
"securityMethods": [
"Oauth"
]
}
]
},
{
"aefId": "",
"versions": [
{
"apiVersion": "v1",
"expiry": "2100-11-30T10:32:02.004Z",
"resources": [
{
"resourceName": "TSN_LIST_PROFILES",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/profile",
"custOpName": "http_get",
"operations": [
"GET"
],
"description": "Endpoint for retrieving the list of available TSN profiles"
},
{
"resourceName": "TSN_DETAIL_PROFILE",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/profile?name={profileName}",
"custOpName": "http_get",
"operations": [
"GET"
],
"description": "Endpoint for retrieving information about a single TSN profile"
},
{
"resourceName": "TSN_APPLY_CONFIGURATION",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/apply",
"custOpName": "http_post",
"operations": [
"POST"
],
"description": "Endpoint for configuring TSN connection parameters"
},
{
"resourceName": "TSN_CLEAR_CONFIGURATION",
"commType": " SUBSCRIBE_NOTIFY",
"uri": "/clear",
"custOpName": "http_post",
"operations": [
"POST"
],
"description": "Endpoint for removing a previous TSN connection configuration"
}
],
"custOperations": [
{
"commType": "REQUEST_RESPONSE",
"custOpName": "string",
"operations": [
"POST"
],
"description": "string"
}
]
}
],
"protocol": "HTTP_1_1",
"dataFormat": "JSON",
"securityMethods": [
"Oauth"
],
"interfaceDescriptions": [
{
"ipv4Addr": "127.0.0.1",
"port": 8899,
"securityMethods": [
"Oauth"
]
}
]
}
],
"description": "API of dummy netapp to test",
"supportedFeatures": "fffff",
"shareableInfo": {
"isShareable": true,
"capifProvDoms": [
"string"
]
},
"serviceAPICategory": "string",
"apiSuppFeats": "fffff",
"pubApiPath": {
"ccfIds": [
"string"
]
},
"ccfId": "string"
}
\ No newline at end of file
import json
import logging
import requests
import urllib3
import emulator_utils
from requests.auth import HTTPBasicAuth
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
logging.basicConfig(
level=logging.INFO, # Nivel mínimo de severidad a registrar
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Formato del mensaje de log
handlers=[
logging.FileHandler("register_logs.log"), # Registra en un archivo
logging.StreamHandler() # También muestra en la consola
]
)
def main():
variables=__load_config_file(config_file=emulator_utils.get_register_file())
log_result = __log_to_capif(variables)
admintoken = log_result["access_token"]
de_register_from_capif(admintoken,variables)
logger.info("User eliminated succesfully")
def __log_to_capif(variables):
logger.info("Logging in to CAPIF")
capif_register_url="https://" + variables["register_host"].strip()+ ":" + variables["capif_register_port"] + "/"
try:
url = capif_register_url + "login"
response = requests.request(
"POST",
url,
headers={"Content-Type": "application/json"},
auth=HTTPBasicAuth(variables["capif_register_username"], variables["capif_register_password"]),
verify=False,
)
response.raise_for_status()
response_payload = json.loads(response.text)
logger.info("Logged in to CAPIF successfully")
return response_payload
except Exception as e:
logger.error(f"Error during login to CAPIF: {e}")
raise
def de_register_from_capif(admin_token,variables):
logger.info("Deleting CAPIF user")
capif_register_url="https://" + variables["register_host"].strip()+ ":" + variables["capif_register_port"] + "/"
url = capif_register_url + "deleteUser/" + variables["uuid"]
headers = {
"Authorization": "Bearer {}".format(admin_token),
"Content-Type": "application/json",
}
response = requests.request(
"DELETE",
url,
headers=headers,
data=None,
verify=False
)
response.raise_for_status()
logger.info("User deleted")
def __load_config_file(config_file: str):
"""Carga el archivo de configuración."""
try:
with open(config_file, 'r') as file:
return json.load(file)
except FileNotFoundError:
logger.warning(f"Configuration file {config_file} not found. Using defaults or environment variables.")
return {}
if __name__ == "__main__":
logger = logging.getLogger("CAPIF Register")
logger.info("Initializing CAPIF Register")
main()
\ No newline at end of file
def get_config_file()-> str :
return "/Users/IDB0128/Documents/OpenCapif/SDK-S6G/Functionalities/Config_files/config.json"
def get_register_file()-> str :
return "/Users/IDB0128/Documents/OpenCapif/SDK-S6G/Functionalities/Config_files/register.json"
def provider_exposer_get_sample_api_description_path() -> str:
return "/Users/IDB0128/Documents/OpenCapif/SDK-S6G/Functionalities/capif_exposer_sample_files/provider_api_description_sample.json"
def get_provider_config_file()->str:
return "/Users/IDB0128/Documents/OpenCapif/SDK-S6G/Functionalities/Config_files/Provider_config.json"
def get_sdk_folder()-> str:
return "/Users/IDB0128/Documents/OpenCapif/SDK-S6G/"
\ No newline at end of file
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFInvokerConnector
def showcase_capif_connector():
"""
This method showcases how one can use the CAPIFConnector class.
"""
capif_connector = CAPIFInvokerConnector(config_file=emulator_utils.get_config_file())
capif_connector.register_and_onboard_Invoker()
print("COMPLETED")
if __name__ == "__main__":
#Let's register invoker to CAPIF. This should happen exactly once
showcase_capif_connector()
import sys
import os
# Agrega la ruta del archivo al sys.path
sys.path.append('/Users/IDB0128/Documents/OpenCapif/SDK-S6G')
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFInvokerConnector
import emulator_utils
def showcase_offboard_and_deregister_invoker():
capif_connector = CAPIFInvokerConnector(config_file=emulator_utils.get_config_file())
capif_connector.offboard_and_deregister_Invoker()
print("COMPLETED")
if __name__ == "__main__":
showcase_offboard_and_deregister_invoker()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import ServiceDiscoverer
def showcase_access_token_retrieval_from_capif():
service_discoverer = ServiceDiscoverer(config_file=emulator_utils.get_config_file())
service_discoverer.discover()
if __name__ == "__main__":
#The following code assumes that you have already registered the net app to capif.
#showcase_service_discovery()
#showcase_retrieve_endpoint_url_from_tsn()
showcase_access_token_retrieval_from_capif()
print("COMPLETED")
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import ServiceDiscoverer
def showcase_access_token_retrieval_from_capif():
service_discoverer = ServiceDiscoverer(config_file=emulator_utils.get_config_file())
service_discoverer.get_tokens()
if __name__ == "__main__":
#The following code assumes that you have already registered the net app to capif.
#showcase_service_discovery()
#showcase_retrieve_endpoint_url_from_tsn()
showcase_access_token_retrieval_from_capif()
print("COMPLETED")
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.register_and_onboard_provider()
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def offboard_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.offboard_and_deregister_nef()
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
offboard_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.get_all_services()
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.get_service()
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.publish_services(
service_api_description_json_full_path=emulator_utils.provider_exposer_get_sample_api_description_path())
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.unpublish_service()
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import emulator_utils
import sys
sys.path.insert(0, emulator_utils.get_sdk_folder)
# Ahora importa las clases desde tu archivo sdk.py
from sdk import CAPIFProviderConnector
def showcase_capif_nef_connector():
"""
"""
capif_connector = CAPIFProviderConnector(config_file=emulator_utils.get_config_file())
capif_connector.update_service(
service_api_description_json_full_path=emulator_utils.provider_exposer_get_sample_api_description_path())
print("COMPLETED")
if __name__ == "__main__":
#Let's register a NEF to CAPIF. This should happen exactly once
showcase_capif_nef_connector()
import json
import logging
import requests
import urllib3
import emulator_utils
from requests.auth import HTTPBasicAuth
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
logging.basicConfig(
level=logging.INFO, # Nivel mínimo de severidad a registrar
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Formato del mensaje de log
handlers=[
logging.FileHandler("register_logs.log"), # Registra en un archivo
logging.StreamHandler() # También muestra en la consola
]
)
def main():
variables=__load_config_file(config_file=emulator_utils.get_register_file())
log_result = __log_to_capif(variables)
admintoken = log_result["access_token"]
postcreation = __create_user(admintoken,variables)
uuid = postcreation["uuid"]
__write_to_file(uuid,variables)
logger.info(uuid)
def __log_to_capif(variables):
logger.info("Logging in to CAPIF")
capif_register_url="https://" + variables["register_host"].strip()+ ":" + variables["capif_register_port"] + "/"
try:
url = capif_register_url + "login"
response = requests.request(
"POST",
url,
headers={"Content-Type": "application/json"},
auth=HTTPBasicAuth(variables["capif_register_username"], variables["capif_register_password"]),
verify=False,
)
response.raise_for_status()
response_payload = json.loads(response.text)
logger.info("Logged in to CAPIF successfully")
return response_payload
except Exception as e:
logger.error(f"Error during login to CAPIF: {e}")
raise
def __create_user(admin_token,variables):
logger.info("Creating user in CAPIF")
capif_register_url="https://" + variables["register_host"].strip()+ ":" + variables["capif_register_port"] + "/"
try:
url = capif_register_url + "createUser"
payload = {
"username": variables["capif_username"],
"password": variables["capif_password"],
"description": "description",
"email": "csr_email_address@tid.es",
"enterprise": "csr_organization",
"country": "crs_locality",
"purpose": "SDK for SAFE 6G",
}
headers = {
"Authorization": "Bearer {}".format(admin_token),
"Content-Type": "application/json",
}
response = requests.request(
"POST", url, headers=headers, data=json.dumps(payload), verify=False
)
response.raise_for_status()
response_payload = json.loads(response.text)
logger.info("User created successfully")
return response_payload
except Exception as e:
logger.error(f"Error during user creation in CAPIF: {e}")
raise
def __load_config_file(config_file: str):
"""Carga el archivo de configuración."""
try:
with open(config_file, 'r') as file:
return json.load(file)
except FileNotFoundError:
logger.warning(f"Configuration file {config_file} not found. Using defaults or environment variables.")
return {}
def __write_to_file(uuid, variables):
logger.info("Saving uuid in config.json")
# Abrimos el archivo y leemos su contenido
with open(variables["config_path"] + "config.json", "r") as infile:
data = json.load(infile)
# Modificamos el contenido del archivo para incluir el nuevo UUID
data["uuid"] = uuid
# Escribimos el contenido actualizado de nuevo en el archivo
with open(variables["config_path"] + "config.json", "w") as outfile:
json.dump(data, outfile, indent=4)
logger.info("Data saved")
if __name__ == "__main__":
logger = logging.getLogger("CAPIF Register")
logger.info("Initializing CAPIF Register")
main()
\ No newline at end of file
README.md 0 → 100644
# SDK-S6G
This tool is focused on connect to CAPIF in a simpler way.
# Functionalities
- **Invoker Capif connector**: Simplifies the process of onboarding for Invoker users
- **Provider Capif connector**: Simplifies the process of onboarding for Provider users,also has the capability to register several APF's and AEF's if its necesary.
- **Invoker Service Discovery**: Facilitates making a Discovery request to CAPIF, also stores the API services recieved and has an option to filter them.
- **Invoker Service Get token**: After the Discovery, this functionality simplifies the way of getting created their propperly security context for each of the services and adquiring the access token to use the final API's
- **Provider Publish Api**: Simplifies the process of publishing an API. Also has the capability to chose which APF and AEF's will be used to publish the API
- **Provider Unpublish Api**: Simplifies the process of deleting an API.
- **Provider Update Api**: Simplifies the process of updating an API. Also has the capability to chose which APF and AEF's will be used to update the API
- **Provider Get Api**: Simplifies the process of recieving the information of One service published previously
- **Provider Get all Apis**: Simplifies the process of recieving the information of all available services published previously.
- **Invoker Capif connector offboarding**: Simplifies the process of offboarding for Invoker users
- **Provider Capif connector offboarding**: Simplifies the process of offboarding for Provider users
![Descripción de la imagen](./images/Flujo%20completo-OPENCAPIF%20ACTUAL.jpg)
## Other Functionalities
Apart from the SDK it is available diferent functionalities for development reasons
- **Register and login**: Facilitates the loggin process for admin users and creates a CAPIF user
- **Deregister and login**: Facilitates the loggin process for admin users and eliminates a CAPIF user
![Descripción de la imagen](./images/Flujo%20completo-SDK%20ACTUAL%20CON%20REGISTER.jpg)
# Installation
To use SDK-S6G we must follow this path for his Installation.
1 - Create an enviroment with pyenv
#Comands to install the enviroment
pyenv install 3.12
pyenv virtualenv 3.12 Sdkenviroment
#OPTIONAL
#Sometimes Mac shells has a little trouble while finding the shell path, try this command
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
2 - Clone the repository
git clone -b v1 --single-branch https://github.com/JorgeEcheva26/SDK-S6G.git
#Then move to the SDK-S6G folder
cd /your/path/to/SDK-S6G
3 - Install the requirements.txt file
cd Safe-6g.egg-info
python -m pip install --upgrade pip
pip install -r requirements.txt
Congratulations! You ended the installation for SDK-S6G
# How to use SDK-S6G
1 - First we need to complete the emulator utils file with our absolute paths in order to complete the configuration of the SDK.The register file is not needed for the use of the SDK.The provider_exposer_get_sample_api_description_path is obligatory if we want to use the publish functionalities.
2 - Then we need to fill out Config files depending on the functionalities we want to use from the SDK
## Config.json
"invoker_folder": String | The path (relative or absolute) of the folder you want to store your invoker information
"provider_folder": String | The path (relative or absolute) of the folder you want to store your invoker information
"capif_host": String | The domain name of your capif host
"register_host": String | The domain name of your register host
"capif_https_port": Integer | The port of your capif host
"capif_register_port": Integer | The port of your register host
"capif_callback_url": String | The Url you want to recieve CAPIF notifications(This functionality is not currently available)
"csr_common_name": String | Information for your invoker certificate
"csr_organizational_unit": String | Information for your invoker certificate
"csr_organization": String | Information for your invoker certificate
"crs_locality": String | Information for your invoker certificate
"csr_state_or_province_name": String |Information for your invoker certificate
"csr_country_name": String | Information for your invoker certificate
"csr_email_address": String | Information for your invoker certificate
"capif_username": String | CAPIF username
"capif_password": String | CAPIF password
"APFs": Integer | Number of APF's you want to onboard as a provider Example:5
"AEFs": Integer | Number of AEF's you want to onboard as a provider Example:2
"debug_mode": Boolean | If you want to recieve logs from SDK-S6G Example:True/False
Required fields no matter you onboard as an invoker or provider:
- Capif_host
- register_host
- capif_https_port
- capif_register_port
- capif_username
- capif_password
- debug_mode
If you want to use SDK as an Invoker you need to fill out these fields
- invoker_folder
- capif_callback_url
- csr_information(csr_common_name,csr_country_name...)
If you want to use SDK as a Provider you need to fill out these fields
- provider_folder
- APFs
- AEFs
## Publish.json
"serviceApiId": String | The Api id we want to use Example "02eff6e1b3a8f7c8044a92ee8a30bd"
"publisherAPFid": String | APF id we chose to use Example : "APFa165364a379035d14311deadc04332"
"publisherAEFsids": Array | Array of strings filled out of AEFs ids we want to use Example: ["AEFfa38f0e855bffb420e4994ecbc8fb9","AEFe8bfa711f4f0c95ba0b382508e6382"]
ServiceApiId is required in:
- Provider Unpublish Api
- Provider Update Api
- Provider Get api
PublisherAPFid is required in:
- Provider Publish Api
- Provider Unpublish Api
- Provider Update Api
- Provider Get Api
- Provider Get all Apis
PublisherAEFsids is required in:
- Provider Publish Api
- Provider Unpublish Api
- Provider Update Api
For using the Publish Api function or the Update function you **must** modify the provider_api_description_sample.json with the Publish API that you want to share following the standard schema for [ServiceAPIDescription](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Publish_Service_API.yaml)
You won't need to fill out the aefIds fields from aefProfiles array because you would already be configurating this fields by completing publisherAEFsids parameter
If the publisherAEFsids parameter don't match with the aefProfiles you will recieve an error
### Important information for Provider users
In the provider_folder, you will find several folders with each capif_username you have onboarded as a provider, for each folder you could find:
- Capif_provider_details.json : Contains all the APFs and AEFs ids you have already onboarded with this capif_username
- CAPIF_provider_api_description_sample.json : If you already published or updated an API, you will find a copy of your last payload.
- Service_received.json : If you already used the get an api or get all apis functionality, you will find the response to your request.
- Published-Apis.json : Constains the currently published APIs with their ApiId
## Discover_filter.json
This file follows the parameters schema from the GET petition of [Discover Services API](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Discover_Service_API.yaml)
To use this feature you must complete the file with the parameters you want to be filtered and then run the Invoker Service Discovery Functionality.
To run the Invoker Service Discovery Functionality you must have onboarded as an Invoker before.
### Important information for Invoker users
In the `invoker_folder`, you will find several folders with each `capif_username` you have onboarded as a provider. For each folder, you could find:
- `Capif_api_security_context_details.json`: This file contains the information of your invoker. It will contain:
1. Your `api_invoker_id`.
2. If you have already used the Service Discovery Functionality, you will find all the available APIs with their information.
3. If you have already used the Service Get Token functionality, you will find your access token for using the APIs you have already discovered.
By default, the Service Get Token will get the access token for using all the APIs that are available. So if you want to filter the APIs and reach only the API you want, you must:
1. Complete your `Discover_filter.json` file.
2. Use the Service Discovery Functionality.
3. Use the Service Get Token Functionality.
## Register.json
"register_host": String | The domain name of your register host
"capif_register_port": Integer | The port of your register host
"capif_register_username": String | CAPIF admin username
"capif_register_password": String | CAPIF admin password
"capif_username": String | CAPIF user username
"capif_password": String | CAPIF user password
"config_path": String | Absolute path to the Config_files folder
"uuid": String | UUID for Deregistering the user
This file is only used for the Functionalities of :
- Register and login
- Deregister and login
Each field is obligatory to complete except UUID, which is only obligatory in case of Deregistering the user.
Although this field is not obligatory we recomend to store the UUID parameter recieved by the Register and login functionality in this field.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment