Create Risk Predictor (Suspicious device)
POST {{apiPath}}/environments/{{envID}}/riskPredictors
This request creates a suspicious device predictor.
By setting the value of shouldValidatePayloadSignature to true, it specifies that any risk policies that include this predictor will require that the Signals SDK payload be provided as a signed JWT whose signature will be verified before proceeding with risk evaluation.
Prerequisites
-
Refer to Risk Predictors for important overview information.
Request Model
Refer to Risk Predictors for the complete data models.
Base data model
| Property | Type | Required? |
|---|---|---|
|
String |
Required |
|
Object |
Required |
|
Object |
Required |
|
String |
Required |
|
String |
Required |
|
Boolean |
Required |
|
String |
Required |
|
Boolean |
Optional |
|
String |
Required |
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/environments/{{envID}}/riskPredictors' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect":"SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/riskPredictors")
{
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"": ""Susp Device with signed SDK payload""," + "\n" +
@" ""compactName"": ""susDeviceSignedPayload""," + "\n" +
@" ""licensed"": true," + "\n" +
@" ""type"": ""DEVICE""," + "\n" +
@" ""detect"":""SUSPICIOUS_DEVICE""," + "\n" +
@" ""shouldValidatePayloadSignature"": true," + "\n" +
@" ""default"": {" + "\n" +
@" ""result"": {" + "\n" +
@" ""level"": ""MEDIUM""" + "\n" +
@" }" + "\n" +
@" }" + "\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}}/riskPredictors"
method := "POST"
payload := strings.NewReader(`{
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect":"SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
}`)
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}}/riskPredictors HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect":"SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"name\": \"Susp Device with signed SDK payload\",\n \"compactName\": \"susDeviceSignedPayload\",\n \"licensed\": true,\n \"type\": \"DEVICE\",\n \"detect\":\"SUSPICIOUS_DEVICE\",\n \"shouldValidatePayloadSignature\": true,\n \"default\": {\n \"result\": {\n \"level\": \"MEDIUM\"\n }\n }\n}");
Request request = new Request.Builder()
.url("{{apiPath}}/environments/{{envID}}/riskPredictors")
.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}}/riskPredictors",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect": "SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/environments/{{envID}}/riskPredictors',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect": "SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/environments/{{envID}}/riskPredictors"
payload = json.dumps({
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": True,
"type": "DEVICE",
"detect": "SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": True,
"default": {
"result": {
"level": "MEDIUM"
}
}
})
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}}/riskPredictors');
$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": "Susp Device with signed SDK payload",\n "compactName": "susDeviceSignedPayload",\n "licensed": true,\n "type": "DEVICE",\n "detect":"SUSPICIOUS_DEVICE",\n "shouldValidatePayloadSignature": true,\n "default": {\n "result": {\n "level": "MEDIUM"\n }\n }\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}}/riskPredictors")
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": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"type": "DEVICE",
"detect": "SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"default": {
"result": {
"level": "MEDIUM"
}
}
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"name\": \"Susp Device with signed SDK payload\",\n \"compactName\": \"susDeviceSignedPayload\",\n \"licensed\": true,\n \"type\": \"DEVICE\",\n \"detect\":\"SUSPICIOUS_DEVICE\",\n \"shouldValidatePayloadSignature\": true,\n \"default\": {\n \"result\": {\n \"level\": \"MEDIUM\"\n }\n }\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/riskPredictors")!,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/riskPredictors/b57a6b99-58cc-4eb9-a3bb-e647c84da2db"
},
"environment": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
}
},
"id": "b57a6b99-58cc-4eb9-a3bb-e647c84da2db",
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"createdAt": "2024-06-18T13:21:21.829Z",
"createdBy": "USER_DEFINED",
"updatedAt": "2024-06-18T13:21:21.829Z",
"name": "Susp Device with signed SDK payload",
"compactName": "susDeviceSignedPayload",
"licensed": true,
"detect": "SUSPICIOUS_DEVICE",
"shouldValidatePayloadSignature": true,
"type": "DEVICE",
"condition": {
"scores": [
{
"name": "HIGH",
"value": "HIGH"
},
{
"name": "MEDIUM",
"value": "MEDIUM"
},
{
"name": "LOW",
"value": "LOW"
}
]
},
"deletable": true,
"tooltip": "predictor.tooltip.device.suspicious.device",
"default": {
"weight": 5,
"score": 80,
"result": {
"level": "MEDIUM",
"type": "VALUE"
},
"evaluated": false
}
}