For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

iControlREST Auth Token and Transaction Example (Postman)

Problem this snippet solves:

This is an example set for iControlREST which generates an Authentication Token and a Transaction session to add a new Data Group.


This is only a single change but you can add many changes into the Transaction before VALIDATING and committing them.


Steps taken:

  1. Get Auth Token - Request to generate a new Authentication Token and saves into the Environment variable X-F5-Auth-Token
  2. Extend Token Timeout - Increases the timeout value of the Auth Token, not always needed but good if you are running the command manually
  3. Get New Transaction - Request to generate a new Transaction session and saves into the Environment variable Coordination-Id
  4. POST new DG in Transaction - Creates a new Data Group
  5. Get Transaction Commands - Optional request to list all the commands and the order in the transaction
  6. Commit Transaction - Sends VALIDATING request to validate and commit the commends
  7. Get DG test - Optional to get the Data Group to confirm it has been created


Find more information about iControlREST Transactions here https://devcentral.f5.com/s/articles/demystifying-icontrol-rest-part-7-understanding-transactions-21404 and in the user guides https://clouddocs.f5.com/api/icontrol-rest/



How to use this snippet:

Download and install Postman https://www.getpostman.com/downloads/


Save the below JSON to a file and import as a new Postman Collection (see https://learning.getpostman.com/docs/postman/collections/intro_to_collections/ and https://learning.getpostman.com/docs/postman/collections/data_formats/#importing-postman-data).


Finally setup a new Environment (https://learning.getpostman.com/docs/postman/environments_and_globals/manage_environments/) within Postman and ensure you have the following elements:

  • hostIP - the Management IP of the F5 BIG-IP system
  • hostName - the Hostname of the F5 BIG-IP system
  • f5user - the username used to generate an Authentication Token
  • f5pass - the password used to generate an Authentication Token
  • X-F5-Auth-Token - leave blank will auto populate
  • Coordination-Id - leave blank will auto populate


e.g.


Then you can run the Postman collection one request at a time or run via Postman's Collection Runner (https://learning.getpostman.com/docs/postman/collection_runs/using_environments_in_collection_runs).


Code :

{
  "info": {
    "_postman_id": "67195ea2-5ac0-4599-a650-5951b1bc1184",
    "name": "iControl Transaction Example",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Get Auth Token",
      "event": [
        {
          "listen": "test",
          "script": {
            "id": "6e3f6680-4199-4c4a-a210-272b4d2eef38",
            "exec": [
              "tests[\"Status code is 200\"] = responseCode.code === 200;",
              "var jsonData = JSON.parse(responseBody);",
              "postman.setEnvironmentVariable(\"X-F5-Auth-Token\", jsonData.token.name);",
              "",
              ""
            ],
            "type": "text/javascript"
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Host",
            "type": "text",
            "value": "{{hostName}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\r\n\t\"username\":\"{{f5user}}\",\r\n\t\"password\":\"{{f5pass}}\",\r\n\t\"loginProviderName\": \"tmos\"\r\n}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/shared/authn/login",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "shared",
            "authn",
            "login"
          ]
        }
      },
      "response": []
    },
    {
      "name": "Extend Token Timeout Copy",
      "event": [
        {
          "listen": "test",
          "script": {
            "id": "3bcdcdc6-fcad-46db-b9c0-4d7a8e8e1a69",
            "exec": [
              "var jsonData = JSON.parse(responseBody);",
              "tests[\"Status code is 200\"] = responseCode.code === 200;",
              "tests[\"Token has been set\"] = jsonData.timeout == 36000;",
              "tests[\"Token is valid\"] = jsonData.userName === postman.getEnvironmentVariable(\"f5user\");",
              ""
            ],
            "type": "text/javascript"
          }
        }
      ],
      "request": {
        "method": "PATCH",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n\t\"timeout\":\"36000\"\n}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/shared/authz/tokens/{{X-F5-Auth-Token}}",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "shared",
            "authz",
            "tokens",
            "{{X-F5-Auth-Token}}"
          ]
        }
      },
      "response": []
    },
    {
      "name": "Get New Transaction",
      "event": [
        {
          "listen": "test",
          "script": {
            "id": "cb847d93-2c3a-4990-8242-020d95532be6",
            "exec": [
              "var jsonRsponse = JSON.parse(responseBody)",
              "pm.environment.set(\"Coordination-Id\", jsonRsponse.transId);",
              "",
              ""
            ],
            "type": "text/javascript"
          }
        }
      ],
      "request": {
        "auth": {
          "type": "noauth"
        },
        "method": "POST",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "content-type",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/transaction/",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "transaction",
            ""
          ]
        }
      },
      "response": []
    },
    {
      "name": "POST new DG in Transaction",
      "request": {
        "auth": {
          "type": "noauth"
        },
        "method": "POST",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "content-type",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}",
            "type": "text"
          },
          {
            "key": "X-F5-REST-Coordination-Id",
            "value": "{{Coordination-Id}}",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n    \"partition\": \"Common\",\n    \"name\": \"url_filter_dg\",\n    \"records\": [\n        {\n            \"name\": \"/data\",\n            \"data\": \"Allow\"\n        },\n        {\n            \"name\": \"/filter\",\n            \"data\": \"Block\"\n        },\n        {\n            \"name\": \"/hello\",\n            \"data\": \"Black\"\n        },\n        {\n            \"name\": \"/login\",\n            \"data\": \"Allow\"\n        }\n    ],\n    \"type\":\"string\"\n}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/ltm/data-group/internal",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "ltm",
            "data-group",
            "internal"
          ]
        }
      },
      "response": []
    },
    {
      "name": "PUT DG in Transaction",
      "request": {
        "auth": {
          "type": "basic",
          "basic": [
            {
              "key": "password",
              "value": "admin",
              "type": "string"
            },
            {
              "key": "username",
              "value": "admin",
              "type": "string"
            }
          ]
        },
        "method": "PUT",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "content-type",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "X-F5-REST-Coordination-Id",
            "value": "{{Coordination-Id}}",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n    \"records\": [\n        {\n            \"name\": \"/data\",\n            \"data\": \"Allow\"\n        },\n        {\n            \"name\": \"/filter\",\n            \"data\": \"Block\"\n        },\n        {\n            \"name\": \"/hello\",\n            \"data\": \"Allow\"\n        },\n        {\n            \"name\": \"/login\",\n            \"data\": \"Allow\"\n        }\n    ]\n}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/ltm/data-group/internal/~common~url_filter_dg",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "ltm",
            "data-group",
            "internal",
            "~common~url_filter_dg"
          ]
        }
      },
      "response": []
    },
    {
      "name": "Get Transaction Commands",
      "event": [
        {
          "listen": "test",
          "script": {
            "id": "cb847d93-2c3a-4990-8242-020d95532be6",
            "exec": [
              "",
              "",
              ""
            ],
            "type": "text/javascript"
          }
        }
      ],
      "protocolProfileBehavior": {
        "disableBodyPruning": true
      },
      "request": {
        "auth": {
          "type": "noauth"
        },
        "method": "GET",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "content-type",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{}"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/transaction/{{Coordination-Id}}/commands",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "transaction",
            "{{Coordination-Id}}",
            "commands"
          ]
        }
      },
      "response": []
    },
    {
      "name": "Commit Transaction",
      "event": [
        {
          "listen": "test",
          "script": {
            "id": "8308b285-b26b-4ddf-8ea9-e4f420cccd42",
            "exec": [
              "var jsonResponse = JSON.parse(responseBody)",
              "",
              "pm.test(\"Transaction status is COMPLETED\", function () {",
              "",
              "    pm.expect(jsonResponse.state == \"COMPLETED\");",
              "});"
            ],
            "type": "text/javascript"
          }
        }
      ],
      "request": {
        "auth": {
          "type": "noauth"
        },
        "method": "PATCH",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "content-type",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}",
            "type": "text"
          },
          {
            "key": "X-F5-REST-Coordination-Id",
            "value": "1557741207510527",
            "type": "text",
            "disabled": true
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "{ \"state\":\"VALIDATING\" }"
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/transaction/{{Coordination-Id}}",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "transaction",
            "{{Coordination-Id}}"
          ]
        }
      },
      "response": []
    },
    {
      "name": "Get DG test",
      "request": {
        "auth": {
          "type": "noauth"
        },
        "method": "GET",
        "header": [
          {
            "key": "Host",
            "value": "{{hostName}}",
            "type": "text"
          },
          {
            "key": "X-F5-Auth-Token",
            "value": "{{X-F5-Auth-Token}}",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": ""
        },
        "url": {
          "raw": "https://{{hostIP}}/mgmt/tm/ltm/data-group/internal/~common~url_filter_dg",
          "protocol": "https",
          "host": [
            "{{hostIP}}"
          ],
          "path": [
            "mgmt",
            "tm",
            "ltm",
            "data-group",
            "internal",
            "~common~url_filter_dg"
          ]
        }
      },
      "response": []
    }
  ]
}

Tested this on version:

No Version Found
Published Jul 02, 2019
Version 1.0
No CommentsBe the first to comment