<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.16 (Ruby 2.7.0) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-scim-cursor-pagination-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="SCIM Cursor Pagination">Cursor-based Pagination of SCIM Resources</title>

    <author initials="D." surname="Zollner" fullname="Danny Zollner" role="editor">
      <organization>Microsoft</organization>
      <address>
        <email>zollnerd@microsoft.com</email>
      </address>
    </author>
    <author initials="A." surname="Sehgal" fullname="Anjali Sehgal">
      <organization>Amazon Web Services</organization>
      <address>
        <email>anjalisg@amazon.com</email>
      </address>
    </author>
    <author initials="D. H." surname="Saxe" fullname="Dean H. Saxe">
      <organization>Amazon Web Services</organization>
      <address>
        <email>deansaxe@amazon.com</email>
      </address>
    </author>

    <date year="2023" month="May" day="09"/>

    <area>IETF</area>
    <workgroup>SCIM</workgroup>
    <keyword>Internet-Draft</keyword> <keyword>SCIM</keyword>

    <abstract>


<t>This document defines additional SCIM (System for Cross-Domain Identity Management) query parameters and result
   attributes to allow use of cursor-based pagination in SCIM
   implementations that are implemented with existing code bases,
   databases, or APIs where cursor-based pagination is already well-
   established.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>The two common patterns for result pagination are index-based pagination 
   and cursor-based pagination.  Rather than
   attempt to compare and contrast the advantages and disadvantages of
   competing pagination patterns, this document simply recognizes that
   SCIM service providers are commonly implemented as an
   interoperability layer on top of already existing application
   codebases, databases, and/or APIs that already have a well-
   established pagination pattern.</t>

<t>Translating from an underlying cursor-based pagination pattern to the
   index-based pagination defined in Section 3.4.2.4 of <xref target="RFC7644"></xref>
   ultimately requires the SCIM service provider to fully iterate the
   underlying cursor, store the results, and then serve indexed pages
   from the stored results.  This task of "pagination translation"
   dramatically increases complexity and memory requirements for
   implementing a SCIM Service Provider, and may be an impediment to
   SCIM adoption for some applications and identity systems.</t>

<t>This document defines a simple addition to the SCIM protocol that
   allows SCIM service providers to reuse underlying cursors without
   expensive translation.  Support for cursor-based pagination in SCIM
   encourages broader cross-application identity management
   interoperability by encouraging SCIM service provider implementations
   for applications and identity systems where cursor-based pagination
   is already well-established.</t>

<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
</section>
<section anchor="query-parameters-and-response-attributes"><name>Query Parameters and Response Attributes</name>

<t>The following table describes the URL pagination parameters requests for using cursor-based pagination:</t>

<texttable title="Query Parameters">
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>cursor</c>
      <c>The string value of the nextCursor attribute from a previous result page. The cursor value <bcp14>MUST</bcp14> be empty or omitted for the first request of a cursor-paginated query.</c>
      <c>count</c>
      <c>A positive integer. Specifies the desired maximum number of query results per page, e.g., count=10. When specified, the service provider <bcp14>MUST NOT</bcp14> return more results than specified, although it <bcp14>MAY</bcp14> return fewer results. If count is not specified in the query, the maximum number of results is set by the service provider.</c>
</texttable>

<t>The following table describes cursor-based pagination attributes
returned in a paged query response:</t>

<texttable title="Response Attributes">
      <ttcol align='left'>Element</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>nextCursor</c>
      <c>A cursor value string that <bcp14>MAY</bcp14> be used in a subsequent request to obtain the next page of results. Service providers supporting cursor-based pagination <bcp14>MUST</bcp14> include nextCursor in all paged query responses except when returning the last page. nextCursor is omitted from a response only to indicate that there are no more result pages.</c>
      <c>previousCursor</c>
      <c>A cursor value string that <bcp14>MAY</bcp14> be used in a subsequent request to obtain the previous page of results. Use of previousCursor is <bcp14>OPTIONAL</bcp14>.</c>
</texttable>

<t>Cursor values are opaque; clients <bcp14>MUST</bcp14> not make assumptions about their structure. When the client wants to retrieve another result page for a query, it should query the same Service
   Provider endpoint with all query parameters and values being
   identical to the initial query with the exception of the cursor value
   which should be set to a nextCursor (or previousCursor) value that
   was returned by Service Provider in a previous response. Cursor values must follow the unreserved characters set defined in section 2.3 of <xref target="RFC3986"></xref></t>

<t>For example, to retrieve the first 10 Users with username starting
   with "J", use an empty cursor and set the count to 10:</t>

<figure><artwork><![CDATA[
      GET /Users?filter=username%20sw%20J&cursor&count=10
      Host: example.com
      Accept: application/scim+json
      Authorization: Bearer U8YJcYYRMjbGeepD
]]></artwork></figure>

<t>The SCIM provider in response to the query above returns metadata regarding pagination similar
to the following example (actual resources removed for brevity):</t>

<figure><artwork><![CDATA[
     HTTP/1.1 200 OK
     Content-Type: application/scim+json
     
     {
       "totalResults":100,
       "itemsPerPage":10,
       "nextCursor":"VZUTiyhEQJ94IR",
       "schemas":["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
       "Resources":[{
          ...
        }]
     }
]]></artwork></figure>

<t>Given the example above, to request the next page or results, use the
   same query parameters and values except set the cursor to the value
   of nextCursor ("VZUTiyhEQJ94IR"):</t>

<figure><artwork><![CDATA[
      GET /Users?filter=username%20sw%20J&cursor=VZUTiyhEQJ94IR&count=10
      Host: example.com
      Accept: application/scim+json
      Authorization: Bearer U8YJcYYRMjbGeepD
]]></artwork></figure>

<figure><artwork><![CDATA[
 HTTP/1.1 200 OK
 Content-Type: application/scim+json
]]></artwork></figure>

<figure><artwork><![CDATA[
     {
       "totalResults":100,
       "itemsPerPage":10,
       "previousCursor: "ze7L30kMiiLX6x"
       "nextCursor":"YkU3OF86Pz0rGv",
       "schemas":["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
       "Resources":[{
          ...
        }]
     }
]]></artwork></figure>

<t>In the example above, the response includes the <bcp14>OPTIONAL</bcp14>
   previousCursor indicating that the Service Provider supports forward
   and reverse traversal of result pages.</t>

<t>As described in Section 3.4.1 of <xref target="RFC7644"></xref> Service Providers <bcp14>SHOULD</bcp14>
   return an accurate value for totalResults which is the total number
   of resources for all pages.  Service Providers implementing cursor
   pagination that are unable to estimate totalResults <bcp14>MAY</bcp14> choose to omit the totalResults attribute.</t>

<section anchor="pagination-errors"><name>Pagination errors</name>

<t>If a Service Provider encounters an invalid pagination query
   parameters (invalid cursor value, count value, etc), or other error
   condition, the Service Provider <bcp14>SHOULD</bcp14> return the appropriate HTTP
   response status code and detailed JSON error response as defined in
   Section 3.12 of <xref target="RFC7644"></xref>.  Most pagination error conditions would
   generate HTTP response with status code 400.  Since many pagination
   error conditions are not user recoverable, error messages <bcp14>SHOULD</bcp14>
   focus on communicating error details to the SCIM client developer.</t>

<t>For HTTP status code 400 (Bad Request) responses, the following detail error types are defined. These error types extend the list of error types defined in RFC 7644 Section 3.12, Table 9: SCIM Detail Error Keyword Values.</t>

<texttable title="Pagination Errors">
      <ttcol align='left'>scimType</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Applicability</ttcol>
      <c>invalidCursor</c>
      <c>Cursor value is invalid. Cursor value should be empty to request the first page and set to the nextCursor or previousCursor value for subsequent queries.</c>
      <c>GET (Section 3.4.2 of <xref target="RFC7644"></xref>)</c>
      <c>expiredCursor</c>
      <c>Cursor has expired. Do not wait longer than cursorTimeout (600 sec) to request additional pages.</c>
      <c>GET (Section 3.4.2 of <xref target="RFC7644"></xref>)</c>
      <c>invalidCount</c>
      <c>Count value is invalid. Count value must be between 1 - and maximimPageSize (500)</c>
      <c>GET (Section 3.4.2 of <xref target="RFC7644"></xref>)</c>
</texttable>

</section>
<section anchor="sorting"><name>Sorting</name>

<t>If sorting is implemented as described Section 3.4.2.3 of <xref target="RFC7644"></xref> ,
   then cursor-paged results <bcp14>SHOULD</bcp14> be sorted.</t>

</section>
<section anchor="cursors-as-the-only-pagination-method"><name>Cursors as the Only Pagination Method</name>

<t>A SCIM Service Provider <bcp14>MAY</bcp14> require cursor-based pagination to
   retrieve all results for a query by including a "nextCursor" value in
   the response even when the query does not include the "cursor"
   parameter.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
      GET /Users
      Host: example.com
      Accept: application/scim+json
]]></artwork></figure>

<t>The SCIM Service Provider may respond to the above query with a page
   containing defaultPageSize results and a "nextCursor" value as shown
   in the below example (Resources omitted for brevity):</t>

<figure><artwork><![CDATA[
     HTTP/1.1 200 OK
     Content-Type: application/scim+json
     
     {
       "totalResults":5000,
       "itemsPerPage":100,
       "nextCursor":"HPq72Pax3JUaNa",
       "schemas":["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
       "Resources":[{
          ...
        }]
     }
]]></artwork></figure>

</section>
</section>
<section anchor="querying-resources-using-http-post"><name>Querying Resources using HTTP POST</name>

<t>Section 3.4.3 of <xref target="RFC7644"></xref> defines how clients <bcp14>MAY</bcp14> execute the HTTP
   POST method combined with the "/.search" path extension to issue
   execute queries without passing parameters on the URL.  When using
   "/.search", the client would pass the parameters defined in Section 2 in the body of the request as shown below.</t>

<figure><artwork><![CDATA[
     POST /User/.search
     Host: example.com
     Accept: application/scim+json
     Authorization: Bearer U8YJcYYRMjbGeepD
     
     {
       "schemas": [
         "urn:ietf:params:scim:api:messages:2.0:SearchRequest"],
       "attributes": ["displayName", "userName"],
       "filter":
          "displayName sw \"smith\"",
       "cursor": "",
       "count": 10
     }
]]></artwork></figure>

<t>Which would return a result containing a "nextCursor" value which may
   be used by the client in a subsequent call to return the next page of
   resources</t>

<figure><artwork><![CDATA[
     HTTP/1.1 200 OK
     Content-Type: application/scim+json
     
     {
       "totalResults":100,
       "itemsPerPage":10,
       "nextCursor":"VZUTiyhEQJ94IR",
       "schemas":["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
       "Resources":[{
          ...
        }]
     }
]]></artwork></figure>

</section>
<section anchor="service-provider-configuration"><name>Service Provider Configuration</name>

<t>The /ServiceProviderConfig resource defined in Section 4 of <xref target="RFC7644"></xref>
   facilitates discovery of SCIM service provider features.  A SCIM
   Service provider implementing cursor-based pagination <bcp14>SHOULD</bcp14> include
   the following additional attribute in JSON document returned by the
   /ServiceProviderConfig endpoint:</t>

<dl>
  <dt>pagination</dt>
  <dd>
    <t>A complex type that indicates pagination configuration options. <bcp14>OPTIONAL</bcp14>.
</t>

    <dl>
      <dt>cursor</dt>
      <dd>
        <t>A Boolean value specifying support of cursor-based paginations.
<bcp14>REQUIRED</bcp14>.</t>
      </dd>
      <dt>index</dt>
      <dd>
        <t>A Boolean value specifying support of index-based pagination.
<bcp14>REQUIRED</bcp14>.</t>
      </dd>
      <dt>defaultPageSize</dt>
      <dd>
        <t>Non-negative integer value specifying the default number of 
results returned in a page when a count is not specified in 
the query.  <bcp14>OPTIONAL</bcp14>.</t>
      </dd>
      <dt>maxPageSize</dt>
      <dd>
        <t>Non-negative integer specifying the maximum number of results 
returned in a page regardless of what is specified for the 
count in a query.  <bcp14>OPTIONAL</bcp14>.</t>
      </dd>
      <dt>cursorTimeout</dt>
      <dd>
        <t>Non-negative integer specifying the maximum number seconds that
  a cursor is valid between page requests.  Clients waiting too long
  between cursor pagination requests may receive an invalid cursor 
  error response.  <bcp14>OPTIONAL</bcp14>.</t>
      </dd>
    </dl>
  </dd>
</dl>

<t>Before using cursor-based pagination, a SCIM client <bcp14>MAY</bcp14> fetch the
   Service Provider Configuration document from the SCIM service
   provider and verify that cursor-based pagination is supported.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
      GET /ServiceProviderConfig
      Host: example.com
      Accept: application/scim+json

]]></artwork></figure>
<t>A service provider supporting both cursor-based pagination and index-
   based pagination would return a document similar to the following
   (full ServiceProviderConfig schema defined in Section 5 of <xref target="RFC7643"></xref>
   has been omitted for brevity):</t>

<figure><artwork><![CDATA[
        HTTP/1.1 200 OK
        Content-Type: application/scim+json
        
        {
       "schemas": [
         "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"],

         ...

       "pagination": {
          "cursor": true,
          "index": true
       },

       ...

      }
]]></artwork></figure>

<t>Service Provider implementors <bcp14>SHOULD</bcp14> ensure that misuse of pagination
   by a SCIM client does not deplete Service Provider resources or
   prevent valid requests from other clients being handled.  Defenses
   for a SCIM Service Provider are similar those used to protect other
   Web API services -- including the use of a "Web API gateway" layer,
   to provide authentication, rate limiting, IP allow/block lists,
   logging and monitoring, response caching, etc.</t>

<t>For example, an obvious protection against abuse is for the Service
   Provider to require client authentication in order to retrieve large
   result sets and enforce an overriding totalResults limit for non-
   authenticated clients.  Another example, would be for a Service
   Provider that implements cursor pagination to restrict number of
   cursors that can be allocated by a client or enforce cursor lifetime.</t>

</section>
<section anchor="change-log"><name>Change Log</name>

<t>v01 - May 2023 - Updated after Httpdir review.</t>

<t>v00 - December 2022 - Adopted by SCIM WG.</t>

</section>
<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The editor would like to acknowledge the contribution and work of Matt Peterson for his work in authoring the original version of this draft.</t>

<t>Matt Peterson
matt.peterson@oneidentity.com</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='RFC7643' target='https://www.rfc-editor.org/info/rfc7643'>
<front>
<title>System for Cross-domain Identity Management: Core Schema</title>
<author fullname='P. Hunt' initials='P.' role='editor' surname='Hunt'><organization/></author>
<author fullname='K. Grizzle' initials='K.' surname='Grizzle'><organization/></author>
<author fullname='E. Wahlstroem' initials='E.' surname='Wahlstroem'><organization/></author>
<author fullname='C. Mortimore' initials='C.' surname='Mortimore'><organization/></author>
<date month='September' year='2015'/>
<abstract><t>The System for Cross-domain Identity Management (SCIM) specifications are designed to make identity management in cloud-based applications and services easier.  The specification suite builds upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models.  Its intent is to reduce the cost and complexity of user management operations by providing a common user schema and extension model as well as binding documents to provide patterns for exchanging this schema using HTTP.</t><t>This document provides a platform-neutral schema and extension model for representing users and groups and other resource types in JSON format.  This schema is intended for exchange and use with cloud service providers.</t></abstract>
</front>
<seriesInfo name='RFC' value='7643'/>
<seriesInfo name='DOI' value='10.17487/RFC7643'/>
</reference>



<reference anchor='RFC7644' target='https://www.rfc-editor.org/info/rfc7644'>
<front>
<title>System for Cross-domain Identity Management: Protocol</title>
<author fullname='P. Hunt' initials='P.' role='editor' surname='Hunt'><organization/></author>
<author fullname='K. Grizzle' initials='K.' surname='Grizzle'><organization/></author>
<author fullname='M. Ansari' initials='M.' surname='Ansari'><organization/></author>
<author fullname='E. Wahlstroem' initials='E.' surname='Wahlstroem'><organization/></author>
<author fullname='C. Mortimore' initials='C.' surname='Mortimore'><organization/></author>
<date month='September' year='2015'/>
<abstract><t>The System for Cross-domain Identity Management (SCIM) specification is an HTTP-based protocol that makes managing identities in multi-domain scenarios easier to support via a standardized service. Examples include, but are not limited to, enterprise-to-cloud service providers and inter-cloud scenarios.  The specification suite seeks to build upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models.  SCIM's intent is to reduce the cost and complexity of user management operations by providing a common user schema, an extension model, and a service protocol defined by this document.</t></abstract>
</front>
<seriesInfo name='RFC' value='7644'/>
<seriesInfo name='DOI' value='10.17487/RFC7644'/>
</reference>



<reference anchor='RFC3986' target='https://www.rfc-editor.org/info/rfc3986'>
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author fullname='T. Berners-Lee' initials='T.' surname='Berners-Lee'><organization/></author>
<author fullname='R. Fielding' initials='R.' surname='Fielding'><organization/></author>
<author fullname='L. Masinter' initials='L.' surname='Masinter'><organization/></author>
<date month='January' year='2005'/>
<abstract><t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='66'/>
<seriesInfo name='RFC' value='3986'/>
<seriesInfo name='DOI' value='10.17487/RFC3986'/>
</reference>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<date month='March' year='1997'/>
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference anchor='RFC8174' target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></author>
<date month='May' year='2017'/>
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>




  </back>

<!-- ##markdown-source:
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

-->

</rfc>

