PingOne Platform APIs

Create Identity Provider (X)

   

POST {{apiPath}}/environments/{{envID}}/identityProviders

The POST {{apiPath}}/environments/{{envID}}/identityProviders operation adds a new identity provider resource to the specified environment.

When the type property value is set to TWITTER, X’s clientId and clientSecret property values are required in the request body.

Prerequisites

Request Model

X identity provider settings data model

Property Type Required?

clientId

String

Required

clientSecret

String

Required

X core attributes

Property Description

id

A string that specifies the core X attribute. The default value is ${providerAttributes.id} and the default update value is EMPTY_ONLY.

X provider attributes

Permission Provider attributes

{no defined permission}

Options are: id, email, name, screen_name, created_at, statuses_count, favourites_count, friends_count, followers_count, verified, protected, description, url, location, profile_image_url_https

Refer to Base IdP data model for the properties available to all of the supported identity providers.

To retrieve a user’s email attribute value from X, an X application must enable the Request email addresses from users permission available under App permissions on docs.x.com. For more information about X configuation requirements, refer to Adding an identity provider - X in the PingOne admin console.

Query parameters
Parameter Description

expand

When equal to attributes, shows the details for the core attribute mapping created by the request.

Example: POST {{apiPath}}/environments/{{envID}}/identityProviders?expand=attributes

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{apiPath}}/environments/{{envID}}/identityProviders' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/identityProviders")
{
  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" +
@"    ""description"": ""Twitter Provider""," + "\n" +
@"    ""enabled"": true," + "\n" +
@"    ""name"": ""TwitterIdP""," + "\n" +
@"    ""type"": ""TWITTER""," + "\n" +
@"    ""clientId"": ""TWITTER_IDP""," + "\n" +
@"    ""clientSecret"": ""TWITTER_SECRET""" + "\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}}/identityProviders"
  method := "POST"

  payload := strings.NewReader(`{
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
}`)

  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}}/identityProviders HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"description\": \"Twitter Provider\",\n    \"enabled\": true,\n    \"name\": \"TwitterIdP\",\n    \"type\": \"TWITTER\",\n    \"clientId\": \"TWITTER_IDP\",\n    \"clientSecret\": \"TWITTER_SECRET\"\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/identityProviders")
  .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}}/identityProviders",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{apiPath}}/environments/{{envID}}/identityProviders',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "description": "Twitter Provider",
    "enabled": true,
    "name": "TwitterIdP",
    "type": "TWITTER",
    "clientId": "TWITTER_IDP",
    "clientSecret": "TWITTER_SECRET"
  })

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

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

payload = json.dumps({
  "description": "Twitter Provider",
  "enabled": True,
  "name": "TwitterIdP",
  "type": "TWITTER",
  "clientId": "TWITTER_IDP",
  "clientSecret": "TWITTER_SECRET"
})
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}}/identityProviders');
$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    "description": "Twitter Provider",\n    "enabled": true,\n    "name": "TwitterIdP",\n    "type": "TWITTER",\n    "clientId": "TWITTER_IDP",\n    "clientSecret": "TWITTER_SECRET"\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}}/identityProviders")

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({
  "description": "Twitter Provider",
  "enabled": true,
  "name": "TwitterIdP",
  "type": "TWITTER",
  "clientId": "TWITTER_IDP",
  "clientSecret": "TWITTER_SECRET"
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"description\": \"Twitter Provider\",\n    \"enabled\": true,\n    \"name\": \"TwitterIdP\",\n    \"type\": \"TWITTER\",\n    \"clientId\": \"TWITTER_IDP\",\n    \"clientSecret\": \"TWITTER_SECRET\"\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/identityProviders")!,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.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/identityProviders/ab403f4f-d4fa-41a5-a296-2b30a917a01b"
        },
        "environment": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        },
        "attributes": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/identityProviders/ab403f4f-d4fa-41a5-a296-2b30a917a01b/attributes"
        }
    },
    "id": "ab403f4f-d4fa-41a5-a296-2b30a917a01b",
    "type": "TWITTER",
    "name": "TwitterIdP",
    "description": "Twitter Provider",
    "enabled": true,
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "createdAt": "2020-05-26T16:51:55.172Z",
    "updatedAt": "2020-05-26T16:51:55.172Z",
    "clientSecret": "TWITTER_SECRET",
    "clientId": "TWITTER_IDP"
}