PingOne Platform APIs

Create FIDO Policy - specific authenticators

 

POST {{apiPath}}/environments/{{envID}}/fido2Policies

Use POST {{apiPath}}/environments/{{envID}}/fido2Policies to create a new FIDO policy for an environment.

This example limits authentication to a specific list of authenticators by setting attestationRequirements to SPECIFIC and providing a list of authenticator IDs in the allowedAuthenticators array.

Prerequisites

Request Model
Property Type Required?

allowedAuthenticators

Array

Optional

attestationRequirements

String

Required

default

Boolean

Optional

description

String

Optional

enforceDuringAuthentication

Boolean

Optional

name

String

Required

publicKeyCredentialHints

Array

Optional

residentKeyRequirement

String

Required

userPresenceTimeout

Object

Optional

userPresenceTimeout.duration

Integer

Optional

userPresenceTimeout.timeUnit

String

Optional

userVerification.enforceDuringAuthentication

Boolean

Optional

userVerification.option

String

Optional

userVerification.pinRequirement

Object

Optional

userVerification.pinRequirement.minLength

Integer

Optional

userVerification.pinRequirement.option

String

Required

Refer to the FIDO Policies data model for full property descriptions.

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
        "enforceDuringAuthentication": true,
        "option": "REQUIRED",
        "pinRequirement" : {
            "option" : "OPTIONAL",
            "minLength" : 8
        }
    },
    "userPresenceTimeout" : {
        "duration" : 110,
        "timeUnit" : "SECONDS"
    },
    "backupEligibility": {
        "enforceDuringAuthentication": true,
        "allow": true
    },
    "userDisplayNameAttributes": {
        "attributes": [
            {
                "name": "username"
            },
            {
                "name": "email"
            }
        ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
        "option": "SPECIFIC",
        "allowedAuthenticators": [
            {
                "id": "{{allowedAuthenticatorID}}"
            },
            {
                "id": "{{allowedAuthenticatorID_2}}"
            }
        ],
        "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints" : [
        "SECURITY_KEY", "CLIENT_DEVICE","HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{apiPath}}/environments/{{envID}}/fido2Policies' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
        "enforceDuringAuthentication": true,
        "option": "REQUIRED",
        "pinRequirement" : {
            "option" : "OPTIONAL",
            "minLength" : 8
        }
    },
    "userPresenceTimeout" : {
        "duration" : 110,
        "timeUnit" : "SECONDS"
    },
    "backupEligibility": {
        "enforceDuringAuthentication": true,
        "allow": true
    },
    "userDisplayNameAttributes": {
        "attributes": [
            {
                "name": "username"
            },
            {
                "name": "email"
            }
        ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
        "option": "SPECIFIC",
        "allowedAuthenticators": [
            {
                "id": "{{allowedAuthenticatorID}}"
            },
            {
                "id": "{{allowedAuthenticatorID_2}}"
            }
        ],
        "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints" : [
        "SECURITY_KEY", "CLIENT_DEVICE","HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/fido2Policies")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"    ""name"": ""FIDO Policy - specific authenticators""," + "\n" +
@"    ""description"": ""FIDO Policy that specifies two authenticators that can be used""," + "\n" +
@"    ""deviceDisplayName"": ""Fido2 device B""," + "\n" +
@"    ""discoverableCredentials"": ""REQUIRED""," + "\n" +
@"    ""authenticatorAttachment"": ""BOTH""," + "\n" +
@"    ""userVerification"": {" + "\n" +
@"        ""enforceDuringAuthentication"": true," + "\n" +
@"        ""option"": ""REQUIRED""," + "\n" +
@"        ""pinRequirement"" : {" + "\n" +
@"            ""option"" : ""OPTIONAL""," + "\n" +
@"            ""minLength"" : 8" + "\n" +
@"        }" + "\n" +
@"    }," + "\n" +
@"    ""userPresenceTimeout"" : {" + "\n" +
@"        ""duration"" : 110," + "\n" +
@"        ""timeUnit"" : ""SECONDS""" + "\n" +
@"    }," + "\n" +
@"    ""backupEligibility"": {" + "\n" +
@"        ""enforceDuringAuthentication"": true," + "\n" +
@"        ""allow"": true" + "\n" +
@"    }," + "\n" +
@"    ""userDisplayNameAttributes"": {" + "\n" +
@"        ""attributes"": [" + "\n" +
@"            {" + "\n" +
@"                ""name"": ""username""" + "\n" +
@"            }," + "\n" +
@"            {" + "\n" +
@"                ""name"": ""email""" + "\n" +
@"            }" + "\n" +
@"        ]" + "\n" +
@"    }," + "\n" +
@"    ""attestationRequirements"": ""DIRECT""," + "\n" +
@"    ""mdsAuthenticatorsRequirements"": {" + "\n" +
@"        ""option"": ""SPECIFIC""," + "\n" +
@"        ""allowedAuthenticators"": [" + "\n" +
@"            {" + "\n" +
@"                ""id"": ""{{allowedAuthenticatorID}}""" + "\n" +
@"            }," + "\n" +
@"            {" + "\n" +
@"                ""id"": ""{{allowedAuthenticatorID_2}}""" + "\n" +
@"            }" + "\n" +
@"        ]," + "\n" +
@"        ""enforceDuringAuthentication"": true" + "\n" +
@"    }," + "\n" +
@"    ""publicKeyCredentialHints"" : [" + "\n" +
@"        ""SECURITY_KEY"", ""CLIENT_DEVICE"",""HYBRID""" + "\n" +
@"    ]," + "\n" +
@"    ""relyingPartyId"": ""relyingpartydomain.example.com""," + "\n" +
@"    ""default"": false" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "{{apiPath}}/environments/{{envID}}/fido2Policies"
  method := "POST"

  payload := strings.NewReader(`{
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
        "enforceDuringAuthentication": true,
        "option": "REQUIRED",
        "pinRequirement" : {
            "option" : "OPTIONAL",
            "minLength" : 8
        }
    },
    "userPresenceTimeout" : {
        "duration" : 110,
        "timeUnit" : "SECONDS"
    },
    "backupEligibility": {
        "enforceDuringAuthentication": true,
        "allow": true
    },
    "userDisplayNameAttributes": {
        "attributes": [
            {
                "name": "username"
            },
            {
                "name": "email"
            }
        ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
        "option": "SPECIFIC",
        "allowedAuthenticators": [
            {
                "id": "{{allowedAuthenticatorID}}"
            },
            {
                "id": "{{allowedAuthenticatorID_2}}"
            }
        ],
        "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints" : [
        "SECURITY_KEY", "CLIENT_DEVICE","HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer {{accessToken}}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
POST /environments/{{envID}}/fido2Policies HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
        "enforceDuringAuthentication": true,
        "option": "REQUIRED",
        "pinRequirement" : {
            "option" : "OPTIONAL",
            "minLength" : 8
        }
    },
    "userPresenceTimeout" : {
        "duration" : 110,
        "timeUnit" : "SECONDS"
    },
    "backupEligibility": {
        "enforceDuringAuthentication": true,
        "allow": true
    },
    "userDisplayNameAttributes": {
        "attributes": [
            {
                "name": "username"
            },
            {
                "name": "email"
            }
        ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
        "option": "SPECIFIC",
        "allowedAuthenticators": [
            {
                "id": "{{allowedAuthenticatorID}}"
            },
            {
                "id": "{{allowedAuthenticatorID_2}}"
            }
        ],
        "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints" : [
        "SECURITY_KEY", "CLIENT_DEVICE","HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"name\": \"FIDO Policy - specific authenticators\",\n    \"description\": \"FIDO Policy that specifies two authenticators that can be used\",\n    \"deviceDisplayName\": \"Fido2 device B\",\n    \"discoverableCredentials\": \"REQUIRED\",\n    \"authenticatorAttachment\": \"BOTH\",\n    \"userVerification\": {\n        \"enforceDuringAuthentication\": true,\n        \"option\": \"REQUIRED\",\n        \"pinRequirement\" : {\n            \"option\" : \"OPTIONAL\",\n            \"minLength\" : 8\n        }\n    },\n    \"userPresenceTimeout\" : {\n        \"duration\" : 110,\n        \"timeUnit\" : \"SECONDS\"\n    },\n    \"backupEligibility\": {\n        \"enforceDuringAuthentication\": true,\n        \"allow\": true\n    },\n    \"userDisplayNameAttributes\": {\n        \"attributes\": [\n            {\n                \"name\": \"username\"\n            },\n            {\n                \"name\": \"email\"\n            }\n        ]\n    },\n    \"attestationRequirements\": \"DIRECT\",\n    \"mdsAuthenticatorsRequirements\": {\n        \"option\": \"SPECIFIC\",\n        \"allowedAuthenticators\": [\n            {\n                \"id\": \"{{allowedAuthenticatorID}}\"\n            },\n            {\n                \"id\": \"{{allowedAuthenticatorID_2}}\"\n            }\n        ],\n        \"enforceDuringAuthentication\": true\n    },\n    \"publicKeyCredentialHints\" : [\n        \"SECURITY_KEY\", \"CLIENT_DEVICE\",\"HYBRID\"\n    ],\n    \"relyingPartyId\": \"relyingpartydomain.example.com\",\n    \"default\": false\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/fido2Policies")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{apiPath}}/environments/{{envID}}/fido2Policies",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
      "enforceDuringAuthentication": true,
      "option": "REQUIRED",
      "pinRequirement": {
        "option": "OPTIONAL",
        "minLength": 8
      }
    },
    "userPresenceTimeout": {
      "duration": 110,
      "timeUnit": "SECONDS"
    },
    "backupEligibility": {
      "enforceDuringAuthentication": true,
      "allow": true
    },
    "userDisplayNameAttributes": {
      "attributes": [
        {
          "name": "username"
        },
        {
          "name": "email"
        }
      ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
      "option": "SPECIFIC",
      "allowedAuthenticators": [
        {
          "id": "{{allowedAuthenticatorID}}"
        },
        {
          "id": "{{allowedAuthenticatorID_2}}"
        }
      ],
      "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints": [
      "SECURITY_KEY",
      "CLIENT_DEVICE",
      "HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{apiPath}}/environments/{{envID}}/fido2Policies',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
      "enforceDuringAuthentication": true,
      "option": "REQUIRED",
      "pinRequirement": {
        "option": "OPTIONAL",
        "minLength": 8
      }
    },
    "userPresenceTimeout": {
      "duration": 110,
      "timeUnit": "SECONDS"
    },
    "backupEligibility": {
      "enforceDuringAuthentication": true,
      "allow": true
    },
    "userDisplayNameAttributes": {
      "attributes": [
        {
          "name": "username"
        },
        {
          "name": "email"
        }
      ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
      "option": "SPECIFIC",
      "allowedAuthenticators": [
        {
          "id": "{{allowedAuthenticatorID}}"
        },
        {
          "id": "{{allowedAuthenticatorID_2}}"
        }
      ],
      "enforceDuringAuthentication": true
    },
    "publicKeyCredentialHints": [
      "SECURITY_KEY",
      "CLIENT_DEVICE",
      "HYBRID"
    ],
    "relyingPartyId": "relyingpartydomain.example.com",
    "default": false
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "{{apiPath}}/environments/{{envID}}/fido2Policies"

payload = json.dumps({
  "name": "FIDO Policy - specific authenticators",
  "description": "FIDO Policy that specifies two authenticators that can be used",
  "deviceDisplayName": "Fido2 device B",
  "discoverableCredentials": "REQUIRED",
  "authenticatorAttachment": "BOTH",
  "userVerification": {
    "enforceDuringAuthentication": True,
    "option": "REQUIRED",
    "pinRequirement": {
      "option": "OPTIONAL",
      "minLength": 8
    }
  },
  "userPresenceTimeout": {
    "duration": 110,
    "timeUnit": "SECONDS"
  },
  "backupEligibility": {
    "enforceDuringAuthentication": True,
    "allow": True
  },
  "userDisplayNameAttributes": {
    "attributes": [
      {
        "name": "username"
      },
      {
        "name": "email"
      }
    ]
  },
  "attestationRequirements": "DIRECT",
  "mdsAuthenticatorsRequirements": {
    "option": "SPECIFIC",
    "allowedAuthenticators": [
      {
        "id": "{{allowedAuthenticatorID}}"
      },
      {
        "id": "{{allowedAuthenticatorID_2}}"
      }
    ],
    "enforceDuringAuthentication": True
  },
  "publicKeyCredentialHints": [
    "SECURITY_KEY",
    "CLIENT_DEVICE",
    "HYBRID"
  ],
  "relyingPartyId": "relyingpartydomain.example.com",
  "default": False
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/environments/{{envID}}/fido2Policies');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n    "name": "FIDO Policy - specific authenticators",\n    "description": "FIDO Policy that specifies two authenticators that can be used",\n    "deviceDisplayName": "Fido2 device B",\n    "discoverableCredentials": "REQUIRED",\n    "authenticatorAttachment": "BOTH",\n    "userVerification": {\n        "enforceDuringAuthentication": true,\n        "option": "REQUIRED",\n        "pinRequirement" : {\n            "option" : "OPTIONAL",\n            "minLength" : 8\n        }\n    },\n    "userPresenceTimeout" : {\n        "duration" : 110,\n        "timeUnit" : "SECONDS"\n    },\n    "backupEligibility": {\n        "enforceDuringAuthentication": true,\n        "allow": true\n    },\n    "userDisplayNameAttributes": {\n        "attributes": [\n            {\n                "name": "username"\n            },\n            {\n                "name": "email"\n            }\n        ]\n    },\n    "attestationRequirements": "DIRECT",\n    "mdsAuthenticatorsRequirements": {\n        "option": "SPECIFIC",\n        "allowedAuthenticators": [\n            {\n                "id": "{{allowedAuthenticatorID}}"\n            },\n            {\n                "id": "{{allowedAuthenticatorID_2}}"\n            }\n        ],\n        "enforceDuringAuthentication": true\n    },\n    "publicKeyCredentialHints" : [\n        "SECURITY_KEY", "CLIENT_DEVICE","HYBRID"\n    ],\n    "relyingPartyId": "relyingpartydomain.example.com",\n    "default": false\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"

url = URI("{{apiPath}}/environments/{{envID}}/fido2Policies")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "name": "FIDO Policy - specific authenticators",
  "description": "FIDO Policy that specifies two authenticators that can be used",
  "deviceDisplayName": "Fido2 device B",
  "discoverableCredentials": "REQUIRED",
  "authenticatorAttachment": "BOTH",
  "userVerification": {
    "enforceDuringAuthentication": true,
    "option": "REQUIRED",
    "pinRequirement": {
      "option": "OPTIONAL",
      "minLength": 8
    }
  },
  "userPresenceTimeout": {
    "duration": 110,
    "timeUnit": "SECONDS"
  },
  "backupEligibility": {
    "enforceDuringAuthentication": true,
    "allow": true
  },
  "userDisplayNameAttributes": {
    "attributes": [
      {
        "name": "username"
      },
      {
        "name": "email"
      }
    ]
  },
  "attestationRequirements": "DIRECT",
  "mdsAuthenticatorsRequirements": {
    "option": "SPECIFIC",
    "allowedAuthenticators": [
      {
        "id": "{{allowedAuthenticatorID}}"
      },
      {
        "id": "{{allowedAuthenticatorID_2}}"
      }
    ],
    "enforceDuringAuthentication": true
  },
  "publicKeyCredentialHints": [
    "SECURITY_KEY",
    "CLIENT_DEVICE",
    "HYBRID"
  ],
  "relyingPartyId": "relyingpartydomain.example.com",
  "default": false
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"name\": \"FIDO Policy - specific authenticators\",\n    \"description\": \"FIDO Policy that specifies two authenticators that can be used\",\n    \"deviceDisplayName\": \"Fido2 device B\",\n    \"discoverableCredentials\": \"REQUIRED\",\n    \"authenticatorAttachment\": \"BOTH\",\n    \"userVerification\": {\n        \"enforceDuringAuthentication\": true,\n        \"option\": \"REQUIRED\",\n        \"pinRequirement\" : {\n            \"option\" : \"OPTIONAL\",\n            \"minLength\" : 8\n        }\n    },\n    \"userPresenceTimeout\" : {\n        \"duration\" : 110,\n        \"timeUnit\" : \"SECONDS\"\n    },\n    \"backupEligibility\": {\n        \"enforceDuringAuthentication\": true,\n        \"allow\": true\n    },\n    \"userDisplayNameAttributes\": {\n        \"attributes\": [\n            {\n                \"name\": \"username\"\n            },\n            {\n                \"name\": \"email\"\n            }\n        ]\n    },\n    \"attestationRequirements\": \"DIRECT\",\n    \"mdsAuthenticatorsRequirements\": {\n        \"option\": \"SPECIFIC\",\n        \"allowedAuthenticators\": [\n            {\n                \"id\": \"{{allowedAuthenticatorID}}\"\n            },\n            {\n                \"id\": \"{{allowedAuthenticatorID_2}}\"\n            }\n        ],\n        \"enforceDuringAuthentication\": true\n    },\n    \"publicKeyCredentialHints\" : [\n        \"SECURITY_KEY\", \"CLIENT_DEVICE\",\"HYBRID\"\n    ],\n    \"relyingPartyId\": \"relyingpartydomain.example.com\",\n    \"default\": false\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/fido2Policies")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()

Example Response

201 Created

{
    "_links": {
        "self": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/fido2Policies"
        },
        "environment": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        },
        "allowedAuthenticators": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/fido2Policies/cf24e37a-c00b-4a04-907c-70c03c3df42f/allowedAuthenticators"
        }
    },
    "id": "cf24e37a-c00b-4a04-907c-70c03c3df42f",
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "updatedAt": "2025-11-17T15:05:39.666Z",
    "createdAt": "2025-11-17T15:05:39.666Z",
    "name": "FIDO Policy - specific authenticators",
    "description": "FIDO Policy that specifies two authenticators that can be used",
    "deviceDisplayName": "Fido2 device B",
    "discoverableCredentials": "REQUIRED",
    "authenticatorAttachment": "BOTH",
    "userVerification": {
        "enforceDuringAuthentication": true,
        "option": "REQUIRED",
        "pinRequirement": {
            "option": "OPTIONAL",
            "minLength": 8
        }
    },
    "userPresenceTimeout": {
        "duration": 110,
        "timeUnit": "SECONDS"
    },
    "backupEligibility": {
        "enforceDuringAuthentication": true,
        "allow": true
    },
    "userDisplayNameAttributes": {
        "attributes": [
            {
                "name": "username"
            },
            {
                "name": "email"
            }
        ]
    },
    "attestationRequirements": "DIRECT",
    "mdsAuthenticatorsRequirements": {
        "enforceDuringAuthentication": true,
        "option": "SPECIFIC",
        "allowedAuthenticators": [
            {
                "id": "{{allowedAuthenticatorID}}"
            },
            {
                "id": "676876565"
            }
        ]
    },
    "relyingPartyId": "relyingpartydomain.example.com",
    "publicKeyCredentialHints": [
        "SECURITY_KEY",
        "CLIENT_DEVICE",
        "HYBRID"
    ],
    "aggregateDevices": false,
    "default": false
}