PingOne Platform APIs

Service Provider Initiated Inbound SSO

GET {{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}

The GET /{{envID}}/saml20/sp/sso operation initiates the SAML single sign-on action at the external identity provider. In the request URL, the idpId parameter specifies the external identity provider’s ID, and the flowId parameter specifies the PingOne flow ID.

When a login hint is specified, the value should be included on the SAML authorization request as the subject element. When the OIDC equivalent of acr_values are specified, the values should be included on the SAML authorization request as AuthnContextClassRef elements. The authentication context references list, if more than one value is specified, are separated by a space.

Query parameters
Parameter Description

flowId

The ID of the specified flow.

idpId

The ID of the identity provider.

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}'
var options = new RestClientOptions("{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Get);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

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

func main() {

  url := "{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}"
  method := "GET"

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

  if err != nil {
    fmt.Println(err)
    return
  }
  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))
}
GET /{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}} HTTP/1.1
Host: {{authPath}}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
  .url("{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}")
  .method("GET", body)
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}",
  "method": "GET",
  "timeout": 0,
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'GET',
  'url': '{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests

url = "{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}"

payload = {}
headers = {}

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

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
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 "net/http"

url = URI("{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var request = URLRequest(url: URL(string: "{{authPath}}/{{envID}}/saml20/sp/sso?idpId={{extIdpID}}&flowId={{flowID}}")!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"

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()