When a SET is available for a SET Recipient, the SET Transmitter queues the SET in a buffer so that a SET Recipient can poll for SETs using HTTP POST.
In poll-based SET delivery using HTTP over TLS, zero or more SETs are delivered in a JSON [
RFC 8259] document to a SET Recipient in response to an HTTP POST request to the SET Transmitter. Then in a following request, the SET Recipient acknowledges received SETs and can poll for more. All requests and responses are JSON documents and use a
Content-Type of
application/json, as described in
Section 2.2.
After successful (acknowledged) SET delivery, SET Transmitters are not required to retain or record SETs for retransmission. Once a SET is acknowledged, the SET Recipient
SHALL be responsible for retention, if needed. Transmitters may also discard undelivered SETs under deployment-specific conditions, such as if they have not been polled for over too long a period of time or if an excessive amount of storage is needed to retain them.
Upon receiving a SET, the SET Recipient reads the SET and validates it in the manner described in
Section 2 of
RFC 8935. The SET Recipient
MUST acknowledge receipt to the SET Transmitter, and
SHOULD do so in a timely fashion, as described in
Section 2.4. The SET Recipient
SHALL NOT use the event acknowledgement mechanism to report event errors other than those relating to the parsing and validation of the SET.
This method allows a SET Recipient to use HTTP POST (
Section 4.3.3 of
RFC 7231) to acknowledge SETs and to check for and receive zero or more SETs. Requests
MAY be made at a periodic interval (short polling) or requests
MAY wait, pending availability of new SETs using long polling, per
Section 2 of
RFC 6202. Note that short polling will result in retrieving zero or more SETs whereas long polling will typically result in retrieving one or more SETs unless a timeout occurs.
The delivery of SETs in this method is facilitated by HTTP POST requests initiated by the SET Recipient in which:
-
The SET Recipient makes a request for available SETs using an HTTP POST to a pre-arranged endpoint provided by the SET Transmitter, or
-
after validating previously received SETs, the SET Recipient initiates another poll request using HTTP POST that includes acknowledgement of previous SETs and requests the next batch of SETs.
The purpose of the acknowledgement is to inform the SET Transmitter that delivery has succeeded and redelivery is no longer required. Before acknowledgement, SET Recipients validate the received SETs and retain them in a manner appropriate to the recipient's requirements. The level and method of retention of SETs by SET Recipients is out of scope of this specification.
When initiating a poll request, the SET Recipient constructs a JSON document that consists of polling request parameters and SET acknowledgement parameters in the form of JSON objects.
When making a request, the HTTP
Content-Type header field is set to
application/json.
The following JSON object members are used in a polling request:
-
Request Processing Parameters
-
-
maxEvents
-
An OPTIONAL integer value indicating the maximum number of unacknowledged SETs to be returned. The SET Transmitter SHOULD NOT send more SETs than the specified maximum. If more than the maximum number of SETs are available, the SET Transmitter determines which to return first; the oldest SETs available MAY be returned first, or another selection algorithm MAY be used, such as prioritizing SETs in some manner that makes sense for the use case. A value of 0 MAY be used by SET Recipients that would like to perform an acknowledge-only request. This enables the Recipient to use separate HTTP requests for acknowledgement and reception of SETs. If this parameter is omitted, no limit is placed on the number of SETs to be returned.
-
returnImmediately
-
An OPTIONAL JSON boolean value that indicates the SET Transmitter SHOULD return an immediate response even if no results are available (short polling). The default value is false, which indicates the request is to be treated as an HTTP long poll, per Section 2 of RFC 6202. The timeout for the request is part of the configuration between the participants, which is out of scope of this specification.
-
SET Acknowledgment Parameters
-
-
ack
-
A JSON array of strings whose values are the jti [RFC 7519] values of successfully received SETs that are being acknowledged. If there are no outstanding SETs to acknowledge, this member is omitted or contains an empty array. Once a SET has been acknowledged, the SET Transmitter is released from any obligation to retain the SET.
-
setErrs
-
A JSON object with one or more members whose keys are the jti values of invalid SETs received. The values of these objects are themselves JSON objects that describe the errors detected using the err and description values specified in Section 2.6. If there are no outstanding SETs with errors to report, this member is omitted or contains an empty JSON object.
In response to a poll request, the SET Transmitter checks for available SETs and responds with a JSON document containing the following JSON object members:
-
sets
-
A JSON object containing zero or more SETs being returned. Each member name is the jti of a SET to be delivered, and its value is a JSON string representing the corresponding SET. If there are no outstanding SETs to be transmitted, the JSON object SHALL be empty. Note that both SETs being transmitted for the first time and SETs that are being retransmitted after not having been acknowledged are communicated here.
-
moreAvailable
-
A JSON boolean value that indicates if more unacknowledged SETs are available to be returned. This member MAY be omitted, with the meaning being the same as including it with the boolean value false.
When making a response, the HTTP
Content-Type header field is set to
application/json.
The SET Recipient performs an HTTP POST (see
Section 4.3.4 of
RFC 7231) to a pre-arranged polling endpoint URI to check for SETs that are available. Because the SET Recipient has no prior SETs to acknowledge, the
ack and
setErrs request parameters are omitted.
After a period of time configured in an out-of-band manner between the SET Transmitter and Recipient, a SET Transmitter
MAY redeliver SETs it has previously delivered. The SET Recipient
SHOULD accept repeat SETs and acknowledge the SETs regardless of whether the Recipient believes it has already acknowledged the SETs previously. A SET Transmitter
MAY limit the number of times it attempts to deliver a SET.
If the SET Recipient has received SETs from the SET Transmitter, the SET Recipient parses and validates that received SETs meet its own requirements and
SHOULD acknowledge receipt in a timely fashion (e.g., seconds or minutes) so that the SET Transmitter can mark the SETs as received. SET Recipients
SHOULD acknowledge receipt before taking any local actions based on the SETs to avoid unnecessary delay in acknowledgement, where possible.
-
Poll requests have three variations:
-
-
Poll-Only
-
In this scenario, a SET Recipient asks for the next set of events where no previous SET deliveries are acknowledged (such as in the initial poll request).
-
Acknowledge-Only
-
In this scenario, a SET Recipient sets the maxEvents value to 0 along with ack and setErrs members indicating the SET Recipient is acknowledging previously received SETs and does not want to receive any new SETs in response to the request.
-
Combined Acknowledge and Poll
-
In this scenario, a SET Recipient is both acknowledging previously received SETs using the ack and setErrs members and will wait for the next group of SETs in the SET Transmitters response.
In the case where no SETs were received in a previous poll (see
Figure 7), the SET Recipient simply polls without acknowledgement parameters (
ack and
setErrs).
The following is a non-normative example request made by a SET Recipient that has no outstanding SETs to acknowledge and is polling for available SETs at the endpoint
https://notify.idp.example.com/Events:
POST /Events HTTP/1.1
Host: notify.idp.example.com
Content-Type: application/json
{
"returnImmediately": true
}
A SET Recipient can poll using default parameter values by passing an empty JSON object.
The following is a non-normative example default poll request to the endpoint
https://notify.idp.example.com/Events:
POST /Events HTTP/1.1
Host: notify.idp.example.com
Content-Type: application/json
{}
In this variation, the SET Recipient acknowledges previously received SETs and indicates it does not want to receive SETs in response by setting the
maxEvents value to
0. This variation might be used, for instance, when a SET Recipient needs to acknowledge received SETs independently (e.g., on separate threads) from the process of receiving SETs.
If the poll needs to return immediately, then
returnImmediately MUST also be present with the value
true. If it is
false, then a long poll will still occur until an event is ready to be returned, even though no events will be returned.
The following is a non-normative example poll request with acknowledgement of SETs received (for example, as shown in
Figure 6):
POST /Events HTTP/1.1
Host: notify.idp.example.com
Content-Type: application/json
{
"ack": [
"4d3559ec67504aaba65d40b0363faad8",
"3d0c3cf797584bd193bd0fb1bd4e7d30"
],
"maxEvents": 0,
"returnImmediately": true
}
This variation allows a recipient thread to simultaneously acknowledge previously received SETs and wait for the next group of SETs in a single request.
The following is a non-normative example poll with acknowledgement of the SETs received in
Figure 6:
POST /Events HTTP/1.1
Host: notify.idp.example.com
Content-Type: application/json
{
"ack": [
"4d3559ec67504aaba65d40b0363faad8",
"3d0c3cf797584bd193bd0fb1bd4e7d30"
],
"returnImmediately": false
}
In the above acknowledgement, the SET Recipient has acknowledged receipt of two SETs and has indicated it wants to wait until the next SET is available.
In the case where errors were detected in previously delivered SETs, the SET Recipient
MAY use the
setErrs member to communicate the errors in the following poll request.
The following is a non-normative example of a response acknowledging one successfully received SET and one SET with an error from the two SETs received in
Figure 6:
POST /Events HTTP/1.1
Host: notify.idp.example.com
Content-Language: en-US
Content-Type: application/json
{
"ack": ["3d0c3cf797584bd193bd0fb1bd4e7d30"],
"setErrs": {
"4d3559ec67504aaba65d40b0363faad8": {
"err": "authentication_failed",
"description": "The SET could not be authenticated"
}
},
"returnImmediately": true
}
In response to a valid poll request, the service provider
MAY respond immediately if SETs are available to be delivered. If no SETs are available at the time of the request, the SET Transmitter
SHALL delay responding until a SET is available or the timeout interval has elapsed unless the poll request parameter
returnImmediately is present with the value
true.
As described in
Section 2.3, a JSON document is returned containing members including
sets, which
SHALL contain zero or more SETs.
The following is a non-normative example response to the request shown in
Section 2.4. This example shows two SETs being returned:
HTTP/1.1 200 OK
Content-Type: application/json
{
"sets":
{
"4d3559ec67504aaba65d40b0363faad8":
"eyJhbGciOiJub25lIn0.
eyJqdGkiOiI0ZDM1NTllYzY3NTA0YWFiYTY1ZDQwYjAzNjNmYWFkOCIsImlhdC
I6MTQ1ODQ5NjQwNCwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
YXVkIjpbImh0dHBzOi8vc2NpbS5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tL0Zl
ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwiZXZlbnRzIjp7InVybj
ppZXRmOnBhcmFtczpzY2ltOmV2ZW50OmNyZWF0ZSI6eyJyZWYiOiJodHRwczov
L3NjaW0uZXhhbXBsZS5jb20vVXNlcnMvNDRmNjE0MmRmOTZiZDZhYjYxZTc1Mj
FkOSIsImF0dHJpYnV0ZXMiOlsiaWQiLCJuYW1lIiwidXNlck5hbWUiLCJwYXNz
d29yZCIsImVtYWlscyJdfX19.",
"3d0c3cf797584bd193bd0fb1bd4e7d30":
"eyJhbGciOiJub25lIn0.
eyJqdGkiOiIzZDBjM2NmNzk3NTg0YmQxOTNiZDBmYjFiZDRlN2QzMCIsImlhdC
I6MTQ1ODQ5NjAyNSwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
YXVkIjpbImh0dHBzOi8vamh1Yi5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9qaHViLmV4YW1wbGUuY29tL0Zl
ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwic3ViIjoiaHR0cHM6Ly
9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIx
ZDkiLCJldmVudHMiOnsidXJuOmlldGY6cGFyYW1zOnNjaW06ZXZlbnQ6cGFzc3
dvcmRSZXNldCI6eyJpZCI6IjQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIxZDkifSwi
aHR0cHM6Ly9leGFtcGxlLmNvbS9zY2ltL2V2ZW50L3Bhc3N3b3JkUmVzZXRFeH
QiOnsicmVzZXRBdHRlbXB0cyI6NX19fQ."
}
}
In the above example, two SETs whose
jti values are
4d3559ec67504aaba65d40b0363faad8 and
3d0c3cf797584bd193bd0fb1bd4e7d30 are delivered.
The following is a non-normative example response to the request shown in
Section 2.4.1, which indicates that no new SETs or unacknowledged SETs are available:
HTTP/1.1 200 OK
Content-Type: application/json
{
"sets": {}
}
Upon receiving the JSON document (e.g., as shown in
Figure 6), the SET Recipient parses and verifies the received SETs and notifies the SET Transmitter of successfully received SETs and SETs with errors via the next poll request to the SET Transmitter, as described in Sections [
2.4.3] and [
2.4.4].
In the event of a general HTTP error condition in the context of processing a poll request, the service provider responds with the applicable HTTP response status code, as defined in
Section 6 of
RFC 7231.
Service providers
MAY respond to any invalid poll request with an HTTP response status code of 400 (Bad Request) even when a more specific code might apply, for example, if the service provider deemed that a more specific code presented an information disclosure risk. When no more specific code might apply, the service provider
SHALL respond to an invalid poll request with an HTTP status code of 400.
The response body for responses to invalid poll requests is left undefined, and its contents
SHOULD be ignored.
The following is a non-normative example of a response to an invalid poll request:
If a SET is invalid, error codes from the IANA "Security Event Token Error Codes" registry established by [
RFC 8935] are used in error responses. As described in
Section 2.3 of
RFC 8935, an error response is a JSON object providing details about the error that includes the following name/value pairs:
-
err:
-
A value from the IANA "Security Event Token Error Codes" registry that identifies the error.
-
description:
-
A human-readable string that provides additional diagnostic information.
When included as part of a batch of SETs, the above JSON is included as part of the
setErrs member, as defined in Sections [
2.2] and [
2.4.4].
When the SET Recipient includes one or more error responses in a request to the SET Transmitter, it must also include in the request a
Content-Language header field whose value indicates the language of the error descriptions included in the request. The method of language selection in the case when the SET Recipient can provide error messages in multiple languages is out of scope for this specification.