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
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to