forked from KantaraInitiative/wg-uma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdraft-uma-core-v1_0_1.xml
2743 lines (2338 loc) · 136 KB
/
draft-uma-core-v1_0_1.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc PUBLIC "-//IETF//DTD RFC 2629//EN"
"http://xml.resource.org/authoring/rfc2629.dtd" [
<!ENTITY RFC2119 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6749 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6749.xml">
<!ENTITY RFC6750 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6750.xml">
<!ENTITY RFC6415 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6415.xml">
<!ENTITY RFC7159 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7159.xml">
<!ENTITY RFC7519 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7519.xml">
<!ENTITY RFC7591 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7591.xml">
<!ENTITY RFC3986 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY RFC6819 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6819.xml">
<!ENTITY RFC6711 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6711.xml">
]>
<rfc category="std" docName="draft-uma-core-14" id="kantara" ipr="kantara">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc='yes' ?>
<?rfc tocdepth='4' ?>
<?rfc symrefs='yes' ?>
<?rfc sortrefs='yes' ?>
<?rfc compact='yes' ?>
<?rfc subcompact='no' ?>
<front>
<title abbrev="UMA Core">User-Managed Access (UMA) Profile of OAuth
2.0</title>
<author fullname="Thomas Hardjono" initials="T." role="editor"
surname="Hardjono">
<organization>MIT</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<author fullname="Eve Maler" initials="E." surname="Maler">
<organization>ForgeRock</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<author fullname="Maciej Machulak" initials="M." surname="Machulak">
<organization>Synergetics</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<author fullname="Domenico Catalano" initials="D." surname="Catalano">
<organization>Oracle</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<date day="" month="September" year="2015" />
<abstract>
<t>User-Managed Access (UMA) is a profile of OAuth 2.0. UMA defines how
resource owners can control protected-resource access by clients
operated by arbitrary requesting parties, where the resources reside on
any number of resource servers, and where a centralized authorization
server governs access based on resource owner policies.</t>
</abstract>
</front>
<middle>
<section anchor="introduction" title="Introduction">
<t>User-Managed Access (UMA) is a profile of OAuth 2.0 <xref
target="RFC6749" />. UMA defines how resource owners can control
protected-resource access by clients operated by arbitrary requesting
parties, where the resources reside on any number of resource servers,
and where a centralized authorization server governs access based on
resource owner policies. Resource owners configure authorization servers
with access policies that serve as asynchronous authorization
grants.</t>
<t>UMA serves numerous use cases where a resource owner uses a dedicated
service to manage authorization for access to their resources,
potentially even without the run-time presence of the resource owner. A
typical example is the following: a web user (an end-user resource
owner) can authorize a web or native app (a client) to gain one-time or
ongoing access to a protected resource containing his home address
stored at a "personal data store" service (a resource server), by
telling the resource server to respect access entitlements issued by his
chosen cloud-based authorization service (an authorization server). The
requesting party operating the client might be the resource owner, where
the app is run by an e-commerce company that needs to know where to ship
a purchased item, or the requesting party might be resource owner's
friend who is using an online address book service to collect contact
information, or the requesting party might be a survey company that uses
an autonomous web service to compile population demographics. A variety
of use cases can be found in <xref target="UMA-usecases" /> and <xref
target="UMA-casestudies" />.</t>
<t>Practical control of access among loosely coupled parties requires
more than just messaging protocols. This specification defines only the
"technical contract" between UMA-conforming entities. Work is ongoing to
define recommendations for developing agreements about the rights and
responsibilities of parties operating and using these entities on a
contractual or legal level (see, for example, <xref
target="UMA-obligations" />). Parties operating entities that claim to
be UMA-conforming should provide documentation of any rights and
obligations between and among them; see <xref
target="trust-considerations" /> for more information.</t>
<t>In enterprise settings, application access management sometimes
involves letting back-office applications serve only as policy
enforcement points (PEPs), depending entirely on access decisions coming
from a central policy decision point (PDP) to govern the access they
give to requesters. This separation eases auditing and allows policy
administration to scale in several dimensions. UMA makes use of a
separation similar to this, letting the resource owner serve as a policy
administrator crafting authorization strategies for resources under
their control.</t>
<t>In order to increase interoperable communication among the
authorization server, resource server, and client, UMA leverages two
purpose-built APIs related to the outsourcing of authorization,
themselves protected by OAuth (or an OAuth-based authentication
protocol) in embedded fashion.</t>
<t>The UMA protocol has three broad phases, as shown in <xref
target="UMA-phases" />.</t>
<figure align="center" anchor="UMA-phases">
<preamble>The Three Phases of the UMA Profile of OAuth</preamble>
<artwork><![CDATA[
+--------------+
| resource |
+---------manage (A)------------ | owner |
| +--------------+
| Phase 1: |
| protect a control (C)
| resource |
v v
+------------+ +----------+--------------+
| | |protection| |
| resource | | API | authorization|
| server |<-protect (B)--| (needs | server |
| | | PAT) | |
+------------+ +----------+--------------+
| protected | | authorization|
| resource | | API |
|(needs RPT) | | (needs AAT) |
+------------+ +--------------+
^ |
| Phases 2 and 3: authorize (D)
| get authorization, |
| access a resource v
| +--------------+
+---------access (E)-------------| client |
+--------------+
requesting party
]]></artwork>
</figure>
<t>The phases work as follows: <list style="hanging">
<t hangText="Protect a resource">(Described in <xref
target="protecting-a-resource" />.) The resource owner, who manages
online resources at the resource server ("A"), introduces it to the
authorization server so that the latter can begin protecting the
resources. To accomplish this, the authorization server presents a
protection API ("B") to the resource server. This API is protected
by OAuth (or an OAuth-based authentication protocol) and requires a
protection API token (PAT) for access. Out of band, the resource
owner configures the authorization server with policies associated
with the resource sets ("C") that the resource registers for
protection.</t>
<t hangText="Get authorization">(Described in <xref
target="getting-authz-accessing-resource" />.) The client approaches
the resource server seeking access to an UMA-protected resource. In
order to access it successfully, the client must first use the
authorization server's authorization API ("D") to obtain
authorization data and a requesting party token (RPT) on behalf of
its requesting party, and the requesting party may need to undergo a
process of trust elevation, for example, supplying identity claims.
The API is protected by OAuth (or an OAuth-based authentication
protocol) and requires an authorization API token (AAT) for
access.</t>
<t hangText="Access a resource">(Described in <xref
target="getting-authz-accessing-resource" />.) The client
successfully presents to the resource server an RPT that has
sufficient authorization data associated with it, gaining access to
the desired resource ("E"). Phase 3 is effectively the "success
path" embedded within phase 2.</t>
</list></t>
<t>Implementers have the opportunity to develop profiles (see <xref
target="profiles" />) that specify and restrict various UMA protocol,
RPT, and identity claim format options, according to deployment and
usage conditions.</t>
<section title="Notational Conventions">
<t>The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT',
'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', and 'OPTIONAL' in this
document are to be interpreted as described in <xref
target="RFC2119" />.</t>
<t>Unless otherwise noted, all protocol properties and values are case
sensitive. JSON <xref target="RFC7159" /> data structures defined by
this specification MAY contain extension properties that are not
defined in this specification. Any entity receiving or retrieving a
JSON data structure SHOULD ignore extension properties it is unable to
understand. Extension names that are unprotected from collisions are
outside the scope of this specification.</t>
</section>
<section anchor="terminology" title="Terminology">
<t>UMA introduces the following new terms and enhancements of OAuth
term definitions.<list hangIndent="6" style="hanging">
<t hangText="resource owner"><vspace />An OAuth resource owner
that is the "user" in User-Managed Access. This is typically an
end-user (a natural person) but it can also be a corporation or
other legal person.</t>
<t hangText="policy">The configuration parameters of an
authorization server that effect resource access management.
Authorization policies typically include elements similar to parts
of speech; for example, "subjects" describe those seeking access
(requesting parties and clients), "verbs" describe operational
scopes of access, and "objects" describe targeted resource sets.
Policy configuration takes place between the resource owner and
the authorization server, and thus is out of scope for this
specification.</t>
<t hangText="requesting party"><vspace />An end-user, or a
corporation or other legal person, that uses a client to seek
access to a protected resource. The requesting party may or may
not be the same party as the resource owner.</t>
<t hangText="client"><vspace />An application making protected
resource requests with the resource owner's authorization and on
the requesting party's behalf.</t>
<t hangText="claim"><vspace />A statement of the value or values
of one or more identity attributes of a requesting party. A
requesting party may need to provide claims to an authorization
server in order to gain permission for access to a protected
resource.</t>
<t hangText="resource set">One or more protected resources that a
resource server manages as a set, abstractly. In authorization
policy terminology, a resource set is the "object" being
protected. This term derives from <xref
target="OAuth-resource-reg" />.</t>
<t hangText="scope">A bounded extent of access that is possible to
perform on a resource set. In authorization policy terminology, a
scope is one of the potentially many "verbs" that can logically
apply to a resource set ("object"). UMA associates scopes with
labeled resource sets. This term derives from <xref
target="OAuth-resource-reg" />.</t>
<t hangText="token">A packaged collection of data meant to be
transmitted to another entity. A token could be used for
authorized access (an "access token"), or could be used to
exchange information about a subject (a "claim token").</t>
<t hangText="requesting party token (RPT)">An UMA access token
associated with a set of authorization data, used by the client to
gain access to protected resources at the resource server.</t>
<t hangText="authorization data">Data associated with an RPT that
enables some combination of the authorization server and resource
server to determine the correct extent of access to allow to a
client. Authorization data is a key part of the definition of an
RPT profile.</t>
<t hangText="authorization server"><vspace />A server that issues
authorization data and RPTs to a client and protects resources
managed at a resource server.</t>
<t hangText="permission">A scope of access over a particular
resource set at a particular resource server that is being
requested by, or granted to, a requesting party. In authorization
policy terminology, a permission is an entitlement that includes a
"subject" (requesting party), "verbs" (one or more scopes of
access), and an "object" (resource set). A permission is one
example of authorization data.</t>
<t hangText="permission ticket">A correlation handle that is
conveyed from an authorization server to a resource server, from a
resource server to a client, and ultimately from a client back to
an authorization server, to enable the authorization server to
assess the correct policies to apply to a request for
authorization data.</t>
<t hangText="authorization API token (AAT)">An OAuth access token
with the scope <spanx style="verb">uma_authorization</spanx>, used
by the client at the authorization API, consisting of the RPT
endpoint.</t>
<t hangText="RPT endpoint">An endpoint at the authorization server
that issues RPTs and authorization data to the client.</t>
<t hangText="protection API token (PAT)">An OAuth access token
with the scope <spanx style="verb">uma_protection</spanx>, used by
the resource server at the protection API, consisting of the
resource set registration, permission registration, and token
introspection endpoints.</t>
<t hangText="resource set registration endpoint">An endpoint at
the authorization server that allows the resource server to
register resource sets.</t>
<t hangText="permission registration endpoint">An endpoint at the
authorization server that allows the resource server to request
permission tickets.</t>
<t hangText="token introspection endpoint">An endpoint at the
authorization server that allows the resource server to query the
status of an RPT and its associated authorization data.</t>
</list></t>
</section>
<section anchor="endpoint-discussion"
title="Achieving Distributed Access Control">
<t>The software components that fill the roles of UMA authorization
servers, resource servers, and clients respectively are intended to
work in an interoperable fashion when each is operated by an
independent party (for example, different organizations). For this
reason, UMA specifies communications channels that the authorization
server MUST implement as HTTP-based APIs that MUST use TLS and OAuth
(or OAuth-based authentication protocol) protection, and that the
resource server MUST implement as an HTTP-based interface. UMA's use
of TLS is governed by <xref target="BCP195" />, which discusses
deployment and adoption characteristics of different TLS versions.</t>
<t>For those OAuth protection use cases where an identity token is
desired in addition to an access token, it is RECOMMENDED that an
OAuth-based authentication protocol such as OpenID Connect <xref
target="OIDCCore" /> be used.</t>
<t>It is also REQUIRED, in turn, for resource servers and clients on
the requesting side of UMA interactions to use these channels, unless
a profile is being used that enables API extensibility. The profiles
that enable such alternatives are provided in <xref
target="comms-profiles" />.</t>
<section anchor="protection-api"
title="Protection API and Protection API Token">
<t>The authorization server MUST present an HTTP-based protection
API, protected by TLS and OAuth (or an OAuth-based authentication
protocol), for use by resource servers. The authorization server
thus has an OAuth token endpoint and authorization endpoint. The
authorization server MUST declare all of its protection API
endpoints in its configuration data (see <xref
target="am-endpoints" />).</t>
<t>The protection API consists of three endpoints:<list
style="symbols">
<t>Resource set registration endpoint as defined by <xref
target="OAuth-resource-reg" /></t>
<t>Permission registration endpoint as defined by <xref
target="register-permission" /></t>
<t>Token introspection endpoint as defined by <xref
target="OAuth-introspection" /> and <xref
target="token-introspection" /></t>
</list></t>
<t>An entity seeking protection API access MUST have the scope
<spanx style="verb">uma_protection</spanx>. An access token with at
least this scope is called a protection API token (PAT) and an
entity that can acquire an access token with this scope is by
definition a resource server. A single entity can serve in both
resource server and client roles if it has access tokens with the
appropriate OAuth scopes. If a request to an endpoint fails due to
an invalid, missing, or expired PAT, or requires higher privileges
at this endpoint than provided by the PAT, the authorization server
responds with an OAuth error.</t>
<t>The authorization server MUST support the OAuth bearer token
profile for PAT issuance, and MAY support other OAuth token
profiles. It MUST declare all supported token profiles and grant
types for PAT issuance in its configuration data. Any OAuth
authorization grant type might be appropriate depending on
circumstances; for example, the client credentials grant is useful
in the case of an organization acting as a resource owner. <xref
target="UMA-Impl" /> discusses grant options further.</t>
<t>A PAT binds a resource owner, a resource server the owner uses
for resource management, and an authorization server the owner uses
for protection of resources at this resource server. It is not
specific to any client or requesting party. The issuance of a PAT
represents the approval of the resource owner for this resource
server to use this authorization server for protecting some or all
of the resources belonging to this resource owner.</t>
<t>Note: The PAT is used in registering a requested permission on a
client's behalf (as described in <xref
target="register-permission" />). One circumstance precipitating
this action is when the client has attempted access without an RPT
(as described in <xref target="without-rpt" />). In order for the
resource server to know which authorization server to approach and
which PAT (representing a resource owner) and resource set
identifier to supply, the resource server's API needs be structured
in such a way that it can derive this information from the client's
RPT-free access attempt. In practice, this information likely needs
to be passed through the URI, headers, or body of the client's
request.</t>
</section>
<section anchor="authorization-api"
title="Authorization API and Authorization API Token">
<t>The authorization server MUST present an HTTP-based authorization
API, protected by TLS and OAuth (or an OAuth-based authentication
protocol), for use by clients. The authorization server thus has an
OAuth token endpoint and authorization endpoint. The authorization
server MUST declare its authorization API endpoint in its
configuration data (see <xref target="am-endpoints" />).</t>
<t>The authorization API consists of one endpoint:<list
style="symbols">
<t>RPT endpoint as defined in <xref
target="permission-success-to-client" /></t>
</list></t>
<t>An entity seeking authorization API access MUST have the scope
<spanx style="verb">uma_authorization</spanx>. An access token with
at least this scope is called an authorization API token (AAT) and
an entity that can acquire an access token with this scope is by
definition a client. A single entity can serve in both resource
server and client roles if it has access tokens with the appropriate
OAuth scopes. If a request to an endpoint fails due to an invalid,
missing, or expired AAT, or requires higher privileges at this
endpoint than provided by the AAT, the authorization server responds
with an OAuth error.</t>
<t>The authorization server MUST support the OAuth bearer token
profile for AAT issuance, and MAY support other OAuth token
profiles. It MUST declare all supported token profiles and grant
types for AAT issuance in its configuration data. Any OAuth
authorization grant type might be appropriate depending on
circumstances; for example, the client credentials grant is useful
in the case of an organization acting as a requesting party. <xref
target="UMA-Impl" /> discusses grant options further.</t>
<t>An AAT binds a requesting party, a client being used by that
party, and an authorization server that protects resources this
client is seeking access to on this requesting party's behalf. It is
not specific to any resource server or resource owner. The issuance
of an AAT represents the approval of this requesting party for this
client to engage with this authorization server to supply claims,
ask for authorization, and perform any other tasks needed for
obtaining authorization for access to resources at all resource
servers that use this authorization server. The authorization server
is able to use this association to manage future processes of
authorization and claims-caching efficiently for this
client/requesting party pair across all resource servers they try to
access; however, these management processes are outside the scope of
this specification.</t>
</section>
<section anchor="resource-api"
title="Protected Resource Interface and Requesting Party Token">
<t>The resource server MAY present to clients whatever HTTP-based
APIs or endpoints it wishes. To protect any of its resources
available in this fashion using UMA, it MUST require a requesting
party token (RPT) with sufficient authorization data for access.</t>
<t>This specification defines one RPT profile, call <spanx
style="verb">Bearer</spanx> (see <xref
target="uma-bearer-token-profile" />), which the authorization
server MUST support. It MAY support additional RPT profiles, and
MUST declare all supported RPT profiles in its configuration data
(see <xref target="am-endpoints" />).</t>
<t>An RPT binds a requesting party, the client being used by that
party, the resource server at which protected resources of interest
reside, and the authorization server that protects those resources.
It is not specific to a single resource owner, though its internal
authorization data components are likely to be bound in practice to
individual resource owners, depending on the RPT profile in use.</t>
<t>Note: The first step in the process of gaining access
authorization is for a client to attempt access to the resource
server's API without an RPT (as described in <xref
target="without-rpt" />), and the second is for the resource server
to register a requested permission on the client's behalf at the
authorization server. This second step requires a PAT. In order for
the resource server to know which authorization server to approach
and which PAT (representing a resource owner) and resource set
identifier to supply, the resource server's API needs be structured
in such a way that it can derive this information from the client's
RPT-free access attempt. In practice, this information likely needs
to be passed through the URI, headers, or body of the client's
request.</t>
</section>
<section title="Time-to-Live Considerations">
<t>The authorization server has the opportunity to manage the
validity periods of access tokens that it issues, their
corresponding refresh tokens where applicable, the individual
authorization data components associated with RPTs where applicable,
and even the client credentials that it issues. Different
time-to-live strategies may be suitable for different resource sets
and scopes of access, and the authorization server has the
opportunity to give the resource owner control over lifetimes of
tokens and authorization data issued on their behalf through policy.
These options are all outside the scope of this specification.</t>
</section>
</section>
<section anchor="am-endpoints"
title="Authorization Server Configuration Data">
<t>The authorization server MUST provide configuration data in a JSON
document that resides in an <spanx
style="verb">/uma-configuration</spanx> directory at its host-meta
<xref target="RFC6415" /> location. The configuration data documents
endpoints and major conformance options supported by the authorization
server.</t>
<t>The configuration data has the following properties.<list
hangIndent="6" style="hanging">
<t hangText="version"><vspace />REQUIRED. The version of the UMA
core protocol to which this authorization server conforms. The
value MUST be the string <spanx style="verb">"1.0"</spanx>.</t>
<t hangText="issuer"><vspace />REQUIRED. A URI with no query or
fragment component that the authorization server asserts as its
issuer identifier. This value MUST be identical to the web
location of the configuration data minus the host-meta [hostmeta]
and <spanx style="verb">/uma-configuration</spanx> path
components.</t>
<t hangText="pat_profiles_supported"><vspace />REQUIRED. OAuth
access token types supported by this authorization server for PAT
issuance. The property value is an array of string values, where
each string value (which MAY be a URI) is a token type. Non-URI
token type strings defined by OAuth token-defining specifications
are privileged. For example, the type "<spanx
style="verb">bearer</spanx>" stands for the OAuth bearer token
type defined in <xref target="RFC6750" />. The authorization
server is REQUIRED to support "<spanx
style="verb">bearer</spanx>", and to supply this value explicitly.
The authorization server MAY declare its support for additional
PAT profiles.</t>
<t hangText="aat_profiles_supported"><vspace />REQUIRED. OAuth
access token types supported by this authorization server for AAT
issuance. The property value is an array of string values, where
each string value (which MAY be a URI) is a token type. Non-URI
token type strings defined by OAuth token-defining specifications
are privileged. For example, the type "<spanx
style="verb">bearer</spanx>" stands for the OAuth bearer token
type defined in <xref target="RFC6750" />. The authorization
server is REQUIRED to support "<spanx
style="verb">bearer</spanx>", and to supply this value explicitly.
The authorization server MAY declare its support for additional
AAT profiles.</t>
<t hangText="rpt_profiles_supported"><vspace />REQUIRED. Profiles
supported by this authorization server for RPT issuance. The
property value is an array of string values, where each string
value is a URI identifying an RPT profile. The authorization
server is REQUIRED to support the <spanx
style="verb">Bearer</spanx> RPT profile defined in <xref
target="uma-bearer-token-profile" />, and to supply its
identifying URI explicitly. The authorization server MAY declare
its support for additional RPT profiles.</t>
<t hangText="pat_grant_types_supported"><vspace />REQUIRED. OAuth
grant types supported by this authorization server in issuing
PATs. The property value is an array of string values, where each
string value (which MAY be a URI) is a grant type. Non-URI token
type strings defined by OAuth grant type-defining specifications
are privileged. For example, the type <spanx
style="verb">authorization_code</spanx> stands for the OAuth
authorization code grant type defined in <xref
target="RFC6749" />.</t>
<t hangText="aat_grant_types_supported"><vspace />REQUIRED. OAuth
grant types supported by this authorization server in issuing
AATs. The property value is an array of string values, where each
string value (which MAY be a URI) is a grant type. Non-URI token
type strings defined by OAuth grant type-defining specifications
are privileged. For example, the type <spanx
style="verb">authorization_code</spanx> stands for the OAuth
authorization code grant type defined in <xref
target="RFC6749" />.</t>
<t hangText="claim_token_profiles_supported"><vspace />OPTIONAL.
Claim token format profiles supported by this authorization
server. The property value is an array of string values, where
each string value MAY be a URI.</t>
<t hangText="uma_profiles_supported"><vspace />OPTIONAL. UMA
profiles supported by this authorization server. The property
value is an array of string values, where each string value is a
URI identifying an UMA profile. Examples of UMA profiles are the
API extensibility profiles defined in <xref
target="comms-profiles" />.</t>
<t hangText="dynamic_client_endpoint"><vspace />OPTIONAL. The
endpoint to use for performing dynamic client registration in the
case of the use of <xref target="RFC7591" />, or alternatively the
reserved string "<spanx style="verb">openid</spanx>" in the case
of the use of <xref target="OIDCDynClientReg" />. In the latter
case, it is presumed that the resource server or client will
discover the dynamic client registration endpoint from the
authorization server's published OpenID Provider Configuration
Information. The presence of this property indicates authorization
server support for dynamic client registration feature; its
absence indicates a lack of support. If the authorization server
supports dynamic client registration, it MUST allow client
applications to register a <spanx
style="verb">claims_redirect_uri</spanx> metadata field, as
defined in <xref target="claim-redirect" />.</t>
<t hangText="token_endpoint"><vspace />REQUIRED. The endpoint URI
at which the resource server or client asks the authorization
server for a PAT or AAT. A requested scope of <spanx
style="verb">uma_protection</spanx> results in a PAT. A requested
scope of <spanx style="verb">uma_authorization</spanx> results in
an AAT. Usage of this endpoint is defined by <xref
target="RFC6749" />.</t>
<t hangText="authorization_endpoint"><vspace />REQUIRED. The
endpoint URI at which the resource server gathers the consent of
the end-user resource owner or the client gathers the consent of
the end-user requesting party for issuance of a PAT or AAT
respectively, if the <spanx
style="verb">authorization_code</spanx> grant type is used. Usage
of this endpoint is defined by <xref target="RFC6749" />.</t>
<t hangText="requesting_party_claims_endpoint"><vspace />OPTIONAL.
The endpoint URI at which the authorization server interacts with
the end-user requesting party to gather claims. If this property
is absent, the authorization server does not interact with the
end-user requesting party for claims gathering.</t>
<t hangText="introspection_endpoint"><vspace />REQUIRED. The
endpoint URI at which the resource server introspects an RPT
presented to it by a client. Usage of this endpoint is defined by
<xref target="OAuth-introspection" /> and <xref
target="token-introspection" />. A valid PAT MUST accompany
requests to this protected endpoint.</t>
<t
hangText="resource_set_registration_endpoint"><vspace />REQUIRED.
The endpoint URI at which the resource server registers resource
sets to put them under authorization manager protection. Usage of
this endpoint is defined by <xref target="OAuth-resource-reg" />
and <xref target="protecting-a-resource" />. A valid PAT MUST
accompany requests to this protected endpoint.</t>
<t hangText="permission_registration_endpoint"><vspace />REQUIRED.
The endpoint URI at which the resource server registers a
requested permission that would suffice for a client's access
attempt. Usage of this endpoint is defined by <xref
target="register-permission" />. A valid PAT MUST accompany
requests to this protected endpoint.</t>
<t hangText="rpt_endpoint"><vspace />REQUIRED. The endpoint URI at
which the client asks for authorization data. Usage of this
endpoint is defined in <xref target="seek-authorization" />. A
valid AAT and a permission ticket MUST, and an RPT MAY, accompany
requests to this protected endpoint.</t>
</list></t>
<figure>
<preamble>Example of authorization server configuration data that
resides at <spanx
style="verb">https://example.com/.well-known/uma-configuration</spanx>
(note the use of <spanx style="verb">https:</spanx> for endpoints
throughout):</preamble>
<artwork><![CDATA[{
"version":"1.0",
"issuer":"https://example.com",
"pat_profiles_supported":["bearer"],
"aat_profiles_supported":["bearer"],
"rpt_profiles_supported":
["https://docs.kantarainitiative.org/uma/profiles/uma-token-bearer-1.0"],
"pat_grant_types_supported":["authorization_code"],
"aat_grant_types_supported":["authorization_code"],
"claim_token_profiles_supported":["https://example.com/claims/formats/token1"],
"dynamic_client_endpoint":"https://as.example.com/dyn_client_reg_uri",
"token_endpoint":"https://as.example.com/token_uri",
"authorization_endpoint":"https://as.example.com/authz_uri",
"requesting_party_claims_endpoint":"https://as.example.com/rqp_claims_uri",
"resource_set_registration_endpoint":"https://as.example.com/rs/rsrc_uri",
"introspection_endpoint":"https://as.example.com/rs/status_uri",
"permission_registration_endpoint":"https://as.example.com/rs/perm_uri",
"rpt_endpoint":"https://as.example.com/client/rpt_uri"
}]]></artwork>
</figure>
<t>Where this specification does not already require optional features
to be documented, it is RECOMMENDED that authorization server
deployers document any profiled or extended features explicitly and
use configuration data to indicate their usage.</t>
</section>
</section>
<section anchor="protecting-a-resource" title="Protecting a Resource">
<t>The resource owner, resource server, and authorization server perform
the following actions to put resources under protection. This list
assumes that the resource server has discovered the authorization
server's configuration data and endpoints as needed.<list
style="numbers">
<t>The authorization server issues client credentials to the
resource server. It is OPTIONAL for the client credentials to be
provided dynamically through <xref target="RFC7591" /> or <xref
target="OIDCDynClientReg" />; alternatively, they MAY use a static
process.</t>
<t>The resource server acquires a PAT (as defined in <xref
target="protection-api" />) from the authorization server. It is
OPTIONAL for the resource owner to introduce the resource server to
the authorization server dynamically (for example, through a
"NASCAR"-style user interface where the resource owner selects a
chosen authorization server); alternatively, they MAY use a static
process that may or may not directly involve the resource owner at
introduction time.</t>
<t>In an ongoing fashion, the resource server registers any resource
sets with the authorization server for which it intends to outsource
protection, using the resource set registration endpoint of the
protection API (see <xref target="OAuth-resource-reg" />).</t>
</list></t>
<t>Note: The resource server is free to offer the option to protect any
subset of the resource owner's resources using different authorization
servers or other means entirely, or to protect some resources and not
others. Additionally, the choice of protection regimes can be made
explicitly by the resource owner or implicitly by the resource server.
Any such partitioning by the resource server or owner is outside the
scope of this specification.</t>
<t>Once a resource set has been placed under authorization server
protection through the registration of a resource set description for
it, and until such a description's deletion by the resource server, the
resource server MUST limit access to corresponding resources, requiring
sufficient authorization data associated with client-presented RPTs by
the authorization server (see <xref
target="permission-success-to-client" />).</t>
<t>Note: The PAT that the resource server uses to register resource sets
must also be used later during client access attempts, for example, in
registering a requested permission on a client's behalf (as described in
<xref target="register-permission" />). One circumstance precipitating
this action is when the client has attempted access without an RPT (as
described in <xref target="without-rpt" />). In order for the resource
server to know which authorization server to approach and which PAT
(representing a resource owner) and resource set identifier to supply,
the resource server's API needs be structured in such a way that it can
derive this information from the client's RPT-free access attempt. In
practice, this information likely needs to be passed through the URI,
headers, or body of the client's request.</t>
</section>
<section anchor="getting-authz-accessing-resource"
title="Getting Authorization and Accessing a Resource">
<t>An authorization server orchestrates and controls clients' access on
their requesting parties' behalf to a resource owner's protected
resources at a resource server, under conditions specified by that
resource owner through policy.</t>
<t>The process of getting authorization and accessing a resource always
begins with the client attempting access at a protected resource
endpoint at the resource server. Several aspects of the client's
behavior are out of scope for this specification:<list style="symbols">
<t>How the client acquired knowledge of the resource server's
client-facing interface and the specific endpoint of the desired
protected resource. For example, the resource server might have a
formally documented API or it might serve up a simple web page, and
the resource owner might have advertised the endpoint publicly on a
blog or other website, listed it in a discovery service, or emailed
a link to a particular intended requesting party. Note: A client
first attempts access to a resource without an RPT, and the resource
server next needs to make a request at the authorization server to
continue the authorization-seeking process. In order for the
resource server to know which authorization server to approach and
which PAT (representing a resource owner) and resource set
identifier to supply on that request, the resource server's API
needs be structured in such a way that it can derive this
information from the client's RPT-free access attempt. In practice,
this information likely needs to be passed through the URI, headers,
or body of the client's request.</t>
<t>The impetus for the client's access attempt. For example, its
end-user requesting party might have clicked on a thumbnail
representation of a graphics-based resource to retrieve a larger
version.</t>
</list></t>
<t>In brief, the entire process is as follows. <list style="symbols">
<t>The client attempts to access the protected resource (see <xref
target="client-attempts-access" />).</t>
<t>If the client's request at the protected resource has no RPT, or
has an invalid RPT or insufficient authorization data associated
with the RPT as determined through RPT status checking (see <xref
target="check-rpt-status" />), the resource server registers a
requested permission with the relevant authorization server (see
<xref target="register-permission" />), and responds to the client
with the resulting permission ticket and the authorization server's
location using a <spanx style="verb">WWW-Authenticate: UMA</spanx>
header (see <xref target="permission-success-to-client" />).</t>
<t>If the resource server fails to get a permission ticket, it
responds to the client with a warning header instead (see <xref
target="permission-failure-to-client" />).</t>
<t>If the client receives a permission ticket and authorization
server location from the resource server, it requests authorization
data from the authorization server (see <xref
target="seek-authorization" />).</t>
<t>If the authorization request and any additional information
required for trust elevation by the authorization server (see <xref
target="need-info" />) sufficiently matches resource owner policies,
the authorization server returns an RPT associated with the
appropriate authorization data to the client (see <xref
target="give-rpt" />).</t>
<t>If the client's attempt has a valid RPT with sufficient
authorization data, the resource owner's policies have been met for
access to the protected resource (see <xref
target="give-access" />).</t>
</list></t>
<t>The recipient of each request message SHOULD respond unless it
detects a security concern, such as a suspected denial of service attack
that can be mitigated by rate limiting.</t>
<section anchor="client-attempts-access"
title="Client Attempts Access to Protected Resource">
<t>This interaction assumes that the resource server has already
registered any relevant resource sets prior to the client's access
attempt at any resource that is intended to be UMA-protected.</t>
<section anchor="without-rpt"
title="Client Request to Resource Server With No RPT">
<figure>
<preamble>Example of a client request at a protected resource
carrying no RPT:</preamble>
<artwork><![CDATA[
GET /users/alice/album/photo.jpg HTTP/1.1
Host: photoz.example.com
...
]]></artwork>
</figure>
<t>If the resource server chooses to respond, it next registers a
requested permission (see <xref
target="register-permission" />).</t>
</section>
<section anchor="with-rpt"
title="Client Request to Resource Server With RPT">
<figure>
<preamble>Example of a client request at a protected resource
carrying an RPT using the UMA <spanx style="verb">Bearer</spanx>
RPT profile:</preamble>
<artwork><![CDATA[
GET /users/alice/album/photo.jpg HTTP/1.1
Authorization: Bearer vF9dft4qmT
Host: photoz.example.com
...
]]></artwork>
</figure>
<t>If the resource server chooses to respond, it next determines the
RPT's status (see <xref target="check-rpt-status" />).</t>
</section>
</section>
<section anchor="register-permission"
title="Resource Server Registers Requested Permission With Authorization Server">
<t>If the client's request at the protected resource has no RPT, or
has an invalid RPT or insufficient authorization data associated with
the RPT as determined through RPT status checking (see <xref
target="check-rpt-status" />), then assuming the resource server
chooses to respond to the client, it MUST use the protection API's
permission registration endpoint to register a requested permission
with the corresponding authorization server. The extent of the
requested permission MUST suffice for the extent of the client's
access attempt at that resource.</t>
<t>Note: The resource server is free to choose the extent of the
requested permission that it registers, as long as it minimally
suffices for the access attempted by the client. For example, it can
choose to register a permission that covers several scopes or a
resource set that is greater in extent than the specific resource that
the client attempted to access.</t>
<t>The PAT provided in the API request enables the authorization
server to map the requested permission to the appropriate resource
owner. The authorization server returns a permission ticket in its
response for the resource server to give to the client that represents
the same extent of requested access that the resource server
registered.</t>
<section title="Resource Server Request to Permission Registration Endpoint">
<t>The resource server uses the POST method at the permission
registration endpoint. The body of the HTTP request message contains
a JSON object providing the requested permission, using a format
derived from the resource set description format specified in <xref
target="OAuth-resource-reg" />, as follows. The object has the
following properties:<list style="hanging">
<t hangText="resource_set_id">REQUIRED. The identifier for a
resource set to which this client is seeking access. The
identifier MUST correspond to a resource set that was previously
registered.</t>
<t hangText="scopes">REQUIRED. An array referencing one or more
identifiers of scopes to which access is needed for this
resource set. Each scope identifier MUST correspond to a scope
that was registered by this resource server for the referenced
resource set.</t>
</list></t>
<figure>
<preamble>Example of an HTTP request that registers a requested
permission at the authorization server's permission registration
endpoint, with a PAT in the header:</preamble>
<artwork><![CDATA[
POST /host/rsrc_uri HTTP/1.1
Content-Type: application/json
Host: as.example.com
Authorization: Bearer 204c69636b6c69
{
"resource_set_id": "112210f47de98100",
"scopes": [
"view",
"http://photoz.example.com/dev/actions/print"
]
}
]]></artwork>
</figure>
</section>
<section anchor="ticket-management"
title="Permission Ticket Creation and Management">
<t>The authorization server uses a permission ticket to maintain the
state of requested permission information, initially conveyed on the
client's behalf by the resource server at attempted resource access
time, for the period of time that the client continues to seek
authorization for that attempted access.</t>
<t>The permission ticket is a short-lived correlation handle
generated by the authorization server that is intended to be opaque
to resource servers and clients. The authorization server therefore
MUST ensure that the ticket is securely random, much as it would for
authorization codes and access tokens. Within these constraints,
however, the authorization server MAY format the ticket however it
chooses, for example either as a random string that references data
held on the server or by including data within the ticket
itself.</t>
<t>Since permission tickets are used only by clients bearing an AAT
at the authorization server, the authorization server can associate
a permission ticket with both a client and a requesting party at the
time the client first makes a request at the RPT endpoint. If the
authorization server observes that a permission ticket is used by
multiple different clients, it SHOULD attempt to revoke all RPTs
already granted based on the compromised permission ticket.</t>
<t>Permission tickets MUST NOT be single-use; this is in order to
allow the client to interact with the authorization server during
the claims-gathering flow, which may require multiple interactions,
either direct or through redirection of a requesting party.</t>
<t>The authorization server MUST invalidate a permission ticket when
an RPT is successfully granted to a client based on this permission
ticket or when the permission ticket expires, whichever occurs
first.</t>
<t>See <xref target="UMA-Impl" /> for more information about
permission ticket management.</t>
</section>
<section title="Authorization Server Response to Resource Server on Permission Registration Success">
<t>If the authorization server is successful in creating a
permission ticket in response to the resource server's request,
responds with an HTTP 201 (Created) status code and includes the