Create Identity Provider (LinkedIn OIDC)
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 LINKEDIN_OIDC, LinkedIn’s clientId and clientSecret property values are required in the request body.
Prerequisites
-
Refer to Identity Provider Management for important overview information.
|
LinkedIn uses permissions to authorize access to its resources. To use LinkedIn as an external identity provider with PingOne, you must request access to the Sign In with LinkedIn using OpenID Connect product permission. |
Request Model
LinkedIn OIDC identity provider settings data model
| Property | Type | Required? |
|---|---|---|
|
String |
Required |
|
String |
Required |
LinkedIn core attributes
| Property | Description |
|---|---|
|
A string that specifies the core LinkedIn OIDC attribute. The default value is |
LinkedIn provider attributes
| Permission | Provider attributes |
|---|---|
|
Options are: |
|
Options are: |
|
Options are: |
Refer to Base IdP data model for the properties available to all of the supported identity providers.
Query parameters
| Parameter | Description |
|---|---|
|
When equal to |
Example: POST {{apiPath}}/environments/{{envID}}/identityProviders?expand=attributes
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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
}'
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"": ""Custom OIDC LinkedIn Identity Provider""," + "\n" +
@" ""enabled"": true," + "\n" +
@" ""name"": ""LinkedInIdP_OIDC""," + "\n" +
@" ""type"": ""LINKEDIN_OIDC""," + "\n" +
@" ""clientId"": ""LINKEDIN_ID_OIDC""," + "\n" +
@" ""clientSecret"": ""LINKEDIN_SECRET_OIDC""" + "\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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
}`)
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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"description\": \"Custom OIDC LinkedIn Identity Provider\",\n \"enabled\": true,\n \"name\": \"LinkedInIdP_OIDC\",\n \"type\": \"LINKEDIN_OIDC\",\n \"clientId\": \"LINKEDIN_ID_OIDC\",\n \"clientSecret\": \"LINKEDIN_SECRET_OIDC\"\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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
}),
};
$.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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
})
};
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": "Custom OIDC LinkedIn Identity Provider",
"enabled": True,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
})
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": "Custom OIDC LinkedIn Identity Provider",\n "enabled": true,\n "name": "LinkedInIdP_OIDC",\n "type": "LINKEDIN_OIDC",\n "clientId": "LINKEDIN_ID_OIDC",\n "clientSecret": "LINKEDIN_SECRET_OIDC"\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": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"name": "LinkedInIdP_OIDC",
"type": "LINKEDIN_OIDC",
"clientId": "LINKEDIN_ID_OIDC",
"clientSecret": "LINKEDIN_SECRET_OIDC"
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"description\": \"Custom OIDC LinkedIn Identity Provider\",\n \"enabled\": true,\n \"name\": \"LinkedInIdP_OIDC\",\n \"type\": \"LINKEDIN_OIDC\",\n \"clientId\": \"LINKEDIN_ID_OIDC\",\n \"clientSecret\": \"LINKEDIN_SECRET_OIDC\"\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/32d30cad-fa50-464a-ac22-dfbb1ac2a1c2"
},
"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/32d30cad-fa50-464a-ac22-dfbb1ac2a1c2/attributes"
}
},
"id": "32d30cad-fa50-464a-ac22-dfbb1ac2a1c2",
"type": "LINKEDIN_OIDC",
"name": "LinkedInIdP_OIDC",
"description": "Custom OIDC LinkedIn Identity Provider",
"enabled": true,
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"createdAt": "2024-10-11T16:26:16.038Z",
"updatedAt": "2024-10-11T16:26:16.038Z",
"clientSecret": "LINKEDIN_SECRET_OIDC",
"clientId": "LINKEDIN_ID_OIDC"
}