That’s fair — I think there’s value in reusable components but they don’t have 
to be controlled by a registry. I’ll back off the registry language for that 
bit and file an issue to that effect.

 — Justin

> On Jul 26, 2020, at 7:26 AM, Torsten Lodderstedt <tors...@lodderstedt.net> 
> wrote:
> 
> Hi,
> 
> the wording regarding type works for me.
> 
> Similar to Brian, I don’t understand how the data type registry is supposed 
> to work.
> 
> In my opinion, type and locations are completely different from the other 
> elements since they are required by the protocol itself. Their semantics must 
> not be changed by applications.
> 
> The other element types are reusable components, but I don’t understand how 
> an application or standard would refer to them, include them into there type 
> definition, and how overloading might happen. For example, are these elements 
> always included in the top level container or can they be used deeper in the 
> structure?
> 
> There are alternative solutions for reuse. I personally would use JSON 
> schemas to define such reusable elements and the authorization data types 
> utilizing them. 
> 
> I therefore don’t see the need for a RAR specific mechanism (a registry).
> 
> best regards,
> Torsten.
> 
>> Am 26.07.2020 um 02:48 schrieb Justin Richer <jric...@mit.edu>:
>> 
>> Brian,
>> 
>> I can appreciate the confusion on the elements registry. It’s really about 
>> having a place to put re-usable components that people might use within 
>> their own “type” definitions, if they want to. The construct in use there is 
>> similar to what we used in Vectors of Trust (RFC8485), 
>> https://tools.ietf.org/html/rfc8485 <https://tools.ietf.org/html/rfc8485>
>> 
>> A VoT “trust framework” document can technically define whatever categories 
>> and values that it wants to. However, there is a registry for common 
>> categories, designed to be core dimensions applicable across a number of 
>> different trust frameworks. 
>> 
>> So the way that it works is that a “type” can redefine its own syntax and 
>> semantics for something like “actions” or “locations”, if it wants to, but 
>> the registry is giving people a place to look and say, “oh hey, someone 
>> already uses ‘actions’ in a general way, maybe that works for me and I can 
>> use that definition, or maybe I should find a different word”. So while 
>> “type” avoids the programmatic namespace collision of two different 
>> definitions of “action”, the registry helps to avoid developer confusion 
>> about having two different uses for the same word. 
>> 
>> It’s not foolproof, but it’s better than making every API designer start 
>> from a completely blank slate.
>> 
>>  — Justin
>> 
>>> On Jul 24, 2020, at 5:55 PM, Brian Campbell <bcampb...@pingidentity.com 
>>> <mailto:bcampb...@pingidentity.com>> wrote:
>>> 
>>> I think I'm on board with the type being a just string and the guidance 
>>> provided about collision-resistance (rather than having a registry for 
>>> types or requiring type to be a URI or something along those lines). I 
>>> don't believe there's actually an issue with string comparison in that 
>>> context and so see no need for the draft to say anything special about it. 
>>> 
>>> In looking at the pull request, however, I'm surprised by there being a 
>>> registry for the data elements. And honestly confused about how that would 
>>> even work in practice. The contents of the authorization details object are 
>>> determined by the `type` parameter but there's also a registry of the 
>>> elements that can make up that content that are general across type. I 
>>> don't see how to reconcile that. 
>>> 
>>> On Mon, Jul 20, 2020 at 10:00 AM Justin Richer <jric...@mit.edu 
>>> <mailto:jric...@mit.edu>> wrote:
>>> I created a pull request with some proposed language here:
>>> 
>>> https://github.com/oauthstuff/draft-oauth-rar/pull/52 
>>> <https://github.com/oauthstuff/draft-oauth-rar/pull/52>
>>> 
>>>  — Justin
>>> 
>>>> On Jul 20, 2020, at 7:42 AM, Justin Richer <jric...@mit.edu 
>>>> <mailto:jric...@mit.edu>> wrote:
>>>> 
>>>> Since this is a recommendation for namespace, we could also just say 
>>>> collision-resistant like JWT, and any of those examples are fine. But that 
>>>> said, I think there’s something particularly compelling about URIs since 
>>>> they have somewhat-human-readable portions. But again, I’m saying it 
>>>> should be a recommendation to API developers and not a requirement in the 
>>>> spec. In the spec, I argue that “type” should be a string, full stop.
>>>> 
>>>> If documentation is so confusing that developers are typing in the wrong 
>>>> strings, then that’s bad documentation. And likely a bad choice for the 
>>>> “type” string on the part of the AS. You’d have the same problem with any 
>>>> other value the developer’s supposed to copy over.  :)
>>>> 
>>>> I agree that we should call out explicitly how they should be compared, 
>>>> and I propose we use one of the handful of existing string-comparison 
>>>> RFC’s here instead of defining our own rules.
>>>> 
>>>> While the type could be a dereferenceable URI, requiring action on the AS 
>>>> is really getting into distributed authorization policies. We tried doing 
>>>> that with UMA1’s scope structures and it didn’t work very well in practice 
>>>> (in my memory and experience). Someone could profile “type" on top of this 
>>>> if they wanted to do so, with support at the AS for that, but I don’t see 
>>>> a compelling reason for that to be a requirement as that’s a lot of 
>>>> complexity and a lot more error states (the fetch fails, or it doesn’t 
>>>> have a policy, or the policy’s in a format the AS doesn’t understand, or 
>>>> the AS doesn’t like the policy, etc). 
>>>> 
>>>> And AS is always free to implement its types in such a fashion, and that 
>>>> could make plenty of sense in a smaller ecosystem. And this is yet another 
>>>> reason that we define “type” as being a string to be interpreted and 
>>>> understood by the AS — so that an AS that wants to work this way can do so.
>>>> 
>>>>  — Justin
>>>> 
>>>> PS: thanks for pointing out the error in the example in XYZ, I’ll fix that 
>>>> prior to publication.
>>>> 
>>>>> On Jul 18, 2020, at 8:58 PM, Dick Hardt <dick.ha...@gmail.com 
>>>>> <mailto:dick.ha...@gmail.com>> wrote:
>>>>> 
>>>>> Justin: thanks for kindly pointing out which mail list this is.
>>>>> 
>>>>> To clarify, public JWT claims are not just URIs, but any 
>>>>> collision-resistant namespace: 
>>>>> "Examples of collision-resistant namespaces include: Domain Names, Object 
>>>>> Identifiers (OIDs) as defined in the ITU-T X.660 and      X.670 
>>>>> Recommendation series, and Universally Unique IDentifiers (UUIDs) 
>>>>> [RFC4122]."
>>>>> 
>>>>> I think letting the "type" be any JSON string and doing a byte-wise 
>>>>> comparison will be problematic. A client developer will be reading 
>>>>> documentation to learn what the types are, and typing it in. Given the 
>>>>> wide set of whitespace characters, and unicode equivalence, different 
>>>>> byte streams will all look the same, and a byte-wise comparison will fail.
>>>>> 
>>>>> Similarly for URIs. If it is a valid URI, then a byte-wise comparison is 
>>>>> not sufficient. Canonicalization is required. 
>>>>> 
>>>>> These are not showstopper issues, but the specification should call out 
>>>>> how type strings are compared, and provide caveats to an AS developer.
>>>>> 
>>>>> I have no idea why you would think the AS would retrieve a URL.
>>>>> 
>>>>> Since the type represents a much more complex object then a JWT claim, a 
>>>>> client developer's tooling could pull down the JSON Schema (or some such) 
>>>>> for a type used in their source code, and provide autocompletion and 
>>>>> validation which would improve productivity and reduce errors. An AS that 
>>>>> is using a defined type could use the schema for input validation. 
>>>>> Neither of these would be at run time. JSON Schema allows comments and 
>>>>> examples.
>>>>> 
>>>>> What is the harm in non-normative language around a retrievable URI?
>>>>> 
>>>>> BTW: the example in 
>>>>> https://oauth.xyz/draft-richer-transactional-authz#rfc.section.2 
>>>>> <https://oauth.xyz/draft-richer-transactional-authz#rfc.section.2> has 
>>>>> not been updated with the "type" field.
>>>>> 
>>>>> 
>>>>> 
>>>>> On Sat, Jul 18, 2020 at 8:10 AM Justin Richer <jric...@mit.edu 
>>>>> <mailto:jric...@mit.edu>> wrote:
>>>>> Hi Dick,
>>>>> 
>>>>> This is a discussion about the RAR specification on the OAuth list, and 
>>>>> therefore doesn’t have anything to do with alignment with XAuth. In fact, 
>>>>> I believe the alignment is the other way around, as doesn’t Xauth 
>>>>> normatively reference RAR at this point? Even though, last I saw, it uses 
>>>>> a different top-level structure for conveying things, I believe it does 
>>>>> say to use the internal object structures. I am also a co-author on RAR 
>>>>> and we had already defined a “type” field in RAR quite some time ago. You 
>>>>> did notice that XYZ’s latest draft added this field to keep the two in 
>>>>> alignment with each other, which has always been the goal since the 
>>>>> initial proposal of the RAR work, but that’s a time lag and not a display 
>>>>> of new intent. 
>>>>> 
>>>>> In any event, even though I think the decision has bearing in both 
>>>>> places, this isn’t about GNAP. Working on RAR’s requirements has brought 
>>>>> up this interesting issue of what should be in the type field for RAR in 
>>>>> OAuth 2.
>>>>> 
>>>>> I think that it should be defined as a string, and therefore compared as 
>>>>> a byte value in all cases, regardless of what the content of the string 
>>>>> is. I don’t think the AS should be expected to fetch a URI for anything. 
>>>>> I don’t think the AS should normalize any of the inputs. I think that any 
>>>>> JSON-friendly character set should be allowed (including spaces and 
>>>>> unicodes), and since RAR already requires the JSON objects to be 
>>>>> form-encoded, this shouldn’t cause additional trouble when adding them in 
>>>>> to OAuth 2’s request structures.
>>>>> 
>>>>> The idea of using a URI would be to get people out of each other’s 
>>>>> namespaces. It’s similar to the concept of “public” vs “private” claims 
>>>>> in JWT:
>>>>> 
>>>>> https://tools.ietf.org/html/rfc7519#section-4.2 
>>>>> <https://tools.ietf.org/html/rfc7519#section-4.2>
>>>>> 
>>>>> What I’m proposing is that if you think it’s going to be a 
>>>>> general-purpose type name, then we recommend you use a URI as your 
>>>>> string. And beyond that, that’s it. It’s up to the AS to figure out what 
>>>>> to do with it, and RAR stays out of it.
>>>>> 
>>>>>  — Justin
>>>>> 
>>>>>> On Jul 17, 2020, at 1:25 PM, Dick Hardt <dick.ha...@gmail.com 
>>>>>> <mailto:dick.ha...@gmail.com>> wrote:
>>>>>> 
>>>>>> Hey Justin, glad to see that you have aligned with the latest XAuth 
>>>>>> draft on a type property being required.
>>>>>> 
>>>>>> I like the idea that the value of the type property is fully defined by 
>>>>>> the AS, which could delegate it to a common URI for reuse. This gets 
>>>>>> GNAP out of specifying access requests, and enables other parties to 
>>>>>> define access without any required coordination with IETF or IANA.
>>>>>> 
>>>>>> A complication in mixing plain strings and URIs is the canonicalization. 
>>>>>> A plain string can be a fixed byte representation, but a URI requires 
>>>>>> canonicalization for comparison. Mixing the two requires URI detection 
>>>>>> at the AS before canonicalization, and an AS MUST do canonicalization of 
>>>>>> URIs.
>>>>>> 
>>>>>> The URI is retrievable, it can provide machine and/or human readable 
>>>>>> documentation in JSON schema or some such, or any other content type. 
>>>>>> Once again, the details are out of scope of GNAP, but we can provide 
>>>>>> examples to guide implementers.
>>>>>> 
>>>>>> Are you still thinking that bare strings are allowed in GNAP, and are 
>>>>>> defined by the AS?
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On Fri, Jul 17, 2020 at 8:39 AM Justin Richer <jric...@mit.edu 
>>>>>> <mailto:jric...@mit.edu>> wrote:
>>>>>> The “type” field in the RAR spec serves an important purpose: it defines 
>>>>>> what goes in the rest of the object, including what other fields are 
>>>>>> available and what values are allowed for those fields. It provides an 
>>>>>> API-level definition for requesting access based on multiple dimensions, 
>>>>>> and that’s really powerful and flexible. Each type can use any of the 
>>>>>> general-purpose fields like “actions” and/or add its own fields as 
>>>>>> necessary, and the “type” parameter keeps everything well-defined.
>>>>>> 
>>>>>> The question, then, is what defines what’s allowed to go into the “type” 
>>>>>> field itself? And what defines how that value maps to the requirements 
>>>>>> for the rest of the object? The draft doesn’t say anything about it at 
>>>>>> the moment, but we should choose the direction we want to go. On the 
>>>>>> surface, there are three main options:
>>>>>> 
>>>>>> 1) Require all values to be registered. 
>>>>>> 2) Require all values to be collision-resistant (eg, URIs).
>>>>>> 3) Require all values to be defined by the AS (and/or the RS’s that it 
>>>>>> protects).
>>>>>> 
>>>>>> Are there any other options?
>>>>>> 
>>>>>> Here are my thoughts on each approach:
>>>>>> 
>>>>>> 1) While it usually makes sense to register things for interoperability, 
>>>>>> this is a case where I think that a registry would actually hurt 
>>>>>> interoperability and adoption. Like a “scope” value, the RAR “type” is 
>>>>>> ultimately up to the AS and RS to interpret in their own context. We 
>>>>>> :want: people to define rich objects for their APIs and enable 
>>>>>> fine-grained access for their systems, and if they have to register 
>>>>>> something every time they come up with a new API to protect, it’s going 
>>>>>> to be an unmaintainable mess. I genuinely don’t think this would scale, 
>>>>>> and that most developers would just ignore the registry and do what they 
>>>>>> want anyway. And since many of these systems are inside domains, it’s 
>>>>>> completely unenforceable in practice.
>>>>>> 
>>>>>> 2) This seems reasonable, but it’s a bit of a nuisance to require 
>>>>>> everything to be a URI here. It’s long and ugly, and a lot of APIs are 
>>>>>> going to be internal to a given group, deployment, or ecosystem anyway. 
>>>>>> This makes sense when you’ve got something reusable across many 
>>>>>> deployments, like OIDC, but it’s overhead when what you’re doing is tied 
>>>>>> to your environment.
>>>>>> 
>>>>>> 3) This allows the AS and RS to define the request parameters for their 
>>>>>> APIs just like they do today with scopes. Since it’s always the 
>>>>>> combination of “this type :AT: this AS/RS”, name spacing is less of an 
>>>>>> issue across systems. We haven’t seen huge problems in scope value 
>>>>>> overlap in the wild, though it does occur from time to time it’s more 
>>>>>> than manageable. A client isn’t going to just “speak RAR”, it’s going to 
>>>>>> be speaking RAR so that it can access something in particular.
>>>>>> 
>>>>>> And all that brings me to my proposal: 
>>>>>> 
>>>>>> 4) Require all values to be defined by the AS, and encourage 
>>>>>> specification developers to use URIs for collision resistance.
>>>>>> 
>>>>>> So officially in RAR, the AS would decide what “type” means, and nobody 
>>>>>> else. But we can also guide people who are developing general-purpose 
>>>>>> interoperable APIs to use URIs for their RAR “type” definitions. This 
>>>>>> would keep those interoperable APIs from stepping on each other, and 
>>>>>> from stepping on any locally-defined special “type” structure. But at 
>>>>>> the end of the day, the URI carries no more weight than just any other 
>>>>>> string, and the AS decides what it means and how it applies.
>>>>>> 
>>>>>> My argument is that this seems to have worked very, very well for 
>>>>>> scopes, and the RAR “type” is cut from similar descriptive cloth.
>>>>>> 
>>>>>> What does the rest of the group think? How should we manage the RAR 
>>>>>> “type” values and what they mean?
>>>>>> 
>>>>>>  — Justin
>>>>>> _______________________________________________
>>>>>> OAuth mailing list
>>>>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>>>>> https://www.ietf.org/mailman/listinfo/oauth 
>>>>>> <https://www.ietf.org/mailman/listinfo/oauth>
>>>>> 
>>>> 
>>>> _______________________________________________
>>>> OAuth mailing list
>>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>>> https://www.ietf.org/mailman/listinfo/oauth 
>>>> <https://www.ietf.org/mailman/listinfo/oauth>
>>> 
>>> _______________________________________________
>>> OAuth mailing list
>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>> https://www.ietf.org/mailman/listinfo/oauth 
>>> <https://www.ietf.org/mailman/listinfo/oauth>
>>> 
>>> CONFIDENTIALITY NOTICE: This email may contain confidential and privileged 
>>> material for the sole use of the intended recipient(s). Any review, use, 
>>> distribution or disclosure by others is strictly prohibited.  If you have 
>>> received this communication in error, please notify the sender immediately 
>>> by e-mail and delete the message and any file attachments from your 
>>> computer. Thank you.
>> 
>> _______________________________________________
>> OAuth mailing list
>> OAuth@ietf.org
>> https://www.ietf.org/mailman/listinfo/oauth

_______________________________________________
OAuth mailing list
OAuth@ietf.org
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to