Justin, I will look over your comments. But looking at some, i was not looking for an explanation but rather I think the text should explain.
For example the registration access token seemed very mysterious. It took a lot of effort to understand what was going on. Maybe i am seeing this as I am looking at the spec with fresh eyes? Phil On 2013-05-15, at 17:53, "Richer, Justin P." <jric...@mitre.org> wrote: > Phil, many thanks for the extremely thorough review! It is very useful > indeed. > > My comments and responses to each point are inline. > > On May 15, 2013, at 4:30 PM, Phil Hunt <phil.h...@oracle.com> wrote: > >> It seems unfortunate that I have not gotten a chance to get into this level >> of detail much earlier. But then, I guess that's what LC review is for! My >> apologies for not getting many of these concerns to the WG much earlier. >> >> Overall >> ----------- >> I think dynamic registration is a critical part of the OAuth framework now >> that we are starting to consider how individual client applications should >> operate when there is one or more deployments of a particular resource API. >> We've moved from the simple use case of a single API provider like Facebook >> or Flickr and moved on to standards based, open source based, and commercial >> based deployments where there are multiple service endpoints and many >> clients to manage. >> >> The dynamic registration spec is actually dealing with a couple of issues >> that I would like to see made more clear in early part of the spec: >> >> 1. How is a new client application recognized for the first time when >> deployed against a particular SP endpoint? Should clients actually assert >> an application_id UUID that never changes and possibly a version id that >> does change with versions? > > In the general case, why is any recognition required? If you're doing things > as part of a larger protocol ecosystem, like Blue Button+ or a particular > OpenID Connect provider, then you can define semantics for tying together > classes of clients (see below for more discussion on this very point). But in > general, a client is just going to show up as a new instance to the AS and > get issued a new, unique client_id, and that's that. > >> >> 2. How are client credentials managed. Are we assuming client credentials >> have a limited lifetime or rotation policy? > > The intent was that client_secret could be rotated, as indicated by the > expires_at member of the response. If a client's secret expires, it calls the > read operation on the Client Configuration Endpoint (§4.2) to get its new > client_secret. If this is unclear in the current text (which I suspect it may > be after multiple refactorings), then I welcome suggestions and specific text > as to how to make that clear. > >> How does a client authenticate the first time and subsequent times to the >> registration service? > > This is a separate question all together, as it does not involve the > client_secret or client_id at all. Rather, the first time the client shows up > to the registration service, it may either: > - Not authenticate at all (this is the true public, open registration, and > it is recommended that servers do this) > - Authenticate using an OAuth 2.0 token (which ATM means a bearer token). > How the client gets that bearer token and what the bearer token means to the > AS beyond "this client is authorized to register" is out of scope for the > spec, by design. > > Subsequent times that the same registered client (by which we mean the same > instance of a client with a particular client_id) shows up at the > registration endpoint (actually, the Client Configuration Endpoint), it uses > its Registration Access Token that it was issued on initial registration. > This is an OAuth 2.0 Bearer token that is unique to the client instance. > >> >> 3. How is versioning of clients managed? Should each new version of a >> client require a change in client registration including possibly changing >> client_id and authentication credential? I don't have a strong feeling, but >> it is something that implementors should consider. > > This is up to the AS, really, and I don't think that any global policy would > ever fly here. Especially if you consider that the entire notion of "version" > is more fluid these days than it ever has been. I wouldn't mind adding a > discussion in the security considerations if it merits mentioning though, so > that we can help both client developers and server developers institute > reasonably good policy. > >> >> 4. What is the registration access token? Why is is used? What is its >> life-cycle? When is it issued, when is it changed? When is it deleted? > > See the response above above and the definition in §1.2: > > Registration Access Token: An OAuth 2.0 Bearer Token issued by the > Authorization Server through the Client Registration Endpoint which is used > by the Client to authenticate itself during read, update, and delete > operations. This token is associated with a particular Client. > > If this can be clarified, I welcome text suggestions. > >> >> If we distinguish between first time registration of a particular client >> software package, it is possible that somethings like authentication method >> can be negotiate in or out-of-band at that time. Subsequent registrations >> should only have parameters for items that could change per deployment (like >> tos_uri). I think token_endpoint_auth_method is one thing that should not >> be negotiated per instance. > >> When subsequent instances register, I have to ask the question, for example >> when would things like "token_endpoint_auth_method" be negotiated or be >> different for the same client software? Should not all instances use the >> same authentication method. > > > I'm confused by this -- as far as the dynamic registration spec is concerned, > all instances are separate from each other. All parameters change per > instance. And instance, you should keep in mind, is defined as any one copy > of the client code connecting to any new authorization server. That pairing > creates the client_id, and therefore the instance, and therefore the > registration access token, and therefore the registration itself at a > conceptual level. So there is no way other than per-instance for a client to > ask for a particular token_endpoint_auth_method. Where else would the AS find > out about it? And there's no way other than per-instance for the server to > tell the client which token_endpoint_auth_method to use. All instances will > probably ask for the same token_endpoint_auth_method from all auth servers > they talk to, right? And each AS will tell each instance that registers with > it to use a particular auth method. There is no way to tie together different > instances across (or within) auth servers without specifying a significant > amount of other machinery. > > Which is not to say that it's not useful in some circumstances to tie > together different instances of the same code across (or within) auth > servers. This is why, with Blue Button+, we specified a specific token format > for the initial access token that the clients use to call the registration > endpoint the first time, as well as a discovery protocol against a > centralized server that handles pre-registration. All of this machinery is, > in my opinion, a stupendous overkill for the general case, though if some > folks find use for it outside of BB+ then it'd be a good thing to abstract > out and make its own spec that extends the Dyn Reg spec in a fully compatible > way. Furthermore, even in Blue Button+ we specify that all auth servers MUST > also accept open registration, without an initial access token, where the > client simply shows up and says "hey, here are my parameters." The auth > server has no way to know in this case any kind of out-of-band negotiation > for different things. In BB+ we are writing very specific policy guidelines > about how to present the UX and things to the end user for all of these > different cases. But again, all of this is specific to the BB+ use case, and > I don't see value in dragging it in to the registration spec on its own. I > believe it would be far too limiting. > >> >> Finally, there seems to be an inconsistent style approach with >> draft-hardjono-oauth-resource-reg which uses ETags. Should this draft do so >> as well? > > That's an individual submission, not a working group draft. Nobody has, until > now, even mentioned the use of ETags here. UMA (where the resource > registration draft comes from) uses ETags, hence their inclusion there. I > personally don't see their utility here, though, and I wouldn't want to > include a wholly new mechanism this late. > >> >> Specific items: >> --------------------- >> "token_endpoint_auth_method" >> >> There is some confusion as to whether this applies to server or client >> authentication. Suggest renaming parameter to >> "token_endpoint_client_auth_method" > > This is the first I've heard of this particular confusion. I'm fine with > either name but at this stage I don't want to make syntax changes without > very, very compelling reasons to do so. > >> >> * Currently, the API only supports a single value instead of an array. If >> the purpose is to allow the client to know what auth methods it supports, >> this should be an array indicated what methods the client supports - or it >> should not be used. > > I would rather like this to be an array, personally, and brought it up with > the OpenID Connect working group about six months ago. But there it was > decided that a single value was simpler and sufficient for the purpose. The > IETF draft has inherited this decision. I *believe* (though am not 100% > positive) that I brought up this very issue in the WG here but didn't receive > any traction on it, so single it remains. > > Also note that this field, like all others in §2, represents two things: the > client telling the server "I want to use this value for this field", and the > server telling the client "this is the value you have for this field". It's > not exactly a negotiation, more like making a polite request to an absolute > dictator who has the last word anyway. But at least this dictator is nice > enough to tell you what their decision was instead of just decapitating you. > >> >> * There is no authn method for "client_secret_saml" or "private_key_saml". > > Nobody has really asked that these two be included or specified. The > extension mechanism (using an absolute URI) would allow someone else to > define these. Is the definition in the SAML Assertion draft sufficient for > their use? > >> >> There are no profiles referenced or defined for "client_secret_jwt" or >> "private_key_jwt". Neither of the JWT or SAML Bearer drafts referenced cover >> these types of flows. They only cover bearer flows. "client_secret_jwt" and >> "private_key_jwt" seem to have some meaning within OpenID Connect, but I >> note that OIDC does not fully define these either. > > The JWT assertion draft does say how to use a JWT for client authentication, > and the DynReg text differentiates between a client signing said JWT with its > own secret symmetrically vs. a client using its own private key, > asymmetrically. > >> >> There is no authentication method defined for "client_bearer_saml" or >> "client_bearer_jwt" or "client_bearer_ref". Since the bearer specs say this >> is acceptable, the dynamic registration spec should accept these. > > I don't understand this bit -- where are these defined in RFC6750? I don't > even know what client_bearer_ref would refer to. > >> >> A possible suggestion is to remove client_secret_jwt and private_key_jwt and >> define those as register extensions since these profiles are not defined. > > That's possible, but they are in active use already. > >> >> >> About "tos_uri" and "policy_uri" >> >> The distinction between tos_uri and policy_uri is unclear. Can we clarify >> or combine them? > > Terms of service and policy are two different documents. One is something > that a user accepts (generally describing what the user will do), one is a > statement of what the service provider (in this case, the client) will do. > More importantly, we used to have only one, and several people asked for them > to be split. > >> >> Also, aren't these really URIs or are they meant to be URLs? > > There was already discussion about this on the list: The IETF is apparently > trying to deprecate URL in favor of URI in new specs. So in practice they'll > nearly always be URLs, but since all URLs are URIs we're not technically > incorrect in following the new policy. And it makes the IESG less mad at us, > which is a plus. > >> >> About "jwks_uri" >> >> A normative reference for >> http://tools.ietf.org/html/draft-ietf-jose-json-web-key-09 is needed. > > Yes, you're correct, I'll add that. > >> >> Should be URL instead of URI? > > See above. :) > >> >> Section 2.1 >> >> In the table urn:ietf:params:oauth:grant-type:jwt-bearer >> is missing. > > It's there in the copy of -10 I'm reading off of ietf.org right now … ? > >> >> “As such, a server supporting these fields SHOULD take steps to ensure that >> a client cannot register itself into an inconsistent state.” >> >> We may want to define more detailed HTTP error response. E.g. 400 status >> code + defined error code (“invalid_client_metadata”)? > > I'd be fine with defining a more explicit error state in this case. I think > it would help interop for the servers that want to enforce grant-type and > response-type restrictions, but servers that can't or don't care about > restricting grants types and whatnot don't have to do anything special. > >> >> Section 2.2 >> >> May want to add: >> >> When “#” language tag is missing, (e.g. “#en” is missing in “client_name”, >> instead of “client_name#en”) the OAuth server may use interpret the language >> used based on server configuration or heuristics. > > That seems inconsistent with what we already have: > > If any human-readable field is sent without a language tag, parties using it > MUST NOT make any assumptions about the language, character set, or script of > the string value, and the string value MUST be used as-is wherever it is > presented in a user interface. > > Which is to say, treat it as a raw byte-value-string and don't try to get > fancy. > >> >> Section 3 >> >> Existing text: >> >> “In order to support open registration and facilitate wider >> interoperability, the Client Registration Endpoint SHOULD allow initial >> registration requests with no authentication. These requests MAY be >> rate-limited or otherwise limited to prevent a denial-of-service attack on >> the Client Registration Endpoint.” >> >> I would suggest to change the first “SHOULD” to “MAY”. In most cloud >> services, the first client is registered by a human user. Then, other >> clients can be further used to automate other client registration. So, the >> first request would typically come with an authenticated user identity. > > I think the weight of "SHOULD" is appropriate here, because I believe that > turning off open registration at the AS (which is what this is talking about) > really ought to be the exception rather than the rule. > >> >> On the flip side, the earlier paragraph: >> >> “The Client Registration Endpoint MAY accept an initial authorization >> credential in the form of an OAuth 2.0 [RFC6749] access token in order to >> limit registration to only previously authorized parties. The method by >> which this access token is obtained by the registrant is generally >> out-of-band and is out of scope of this specification.” >> >> I tend to think it would be better to change this “MAY” to “SHOULD”. >> >> That access token would carry a human user authenticated identity somehow. >> In some cases, it can be a pure authenticated user assertion token. > > Again, disagree, for the same reasoning as above. > >> >> About section 4.3: >> >> If the client does not exist on this server, the server MUST respond >> with HTTP 401 Unauthorized, and the Registration Access Token used to >> make this request SHOULD be immediately revoked. >> >> If the Client does not exist on this server, shouldn't it return a "404 Not >> Found"? >> >> If revoking the registration access token, is it bound to a single client >> registration? This is not clear. What is the lifecycle around registration >> access token? Only hint is in the Client Information Response in section 5.1. > > The language about the 401 here (and in other nearby sections) is > specifically so that you treat a missing client and a bad registration access > token the same way. You see, returning a 404 here actually indicates things > were in an inconsistent state. Namely, that the registration access token was > still valid but the client that the registration access token was attached to > doesn't exist anymore. The registration access token in meant to be tied to a > client's instance (or registration), so it's actually more sensible to act as > though the registration access token isn't valid anymore. In at least some > implementations (specifically ours at MITRE that's built on SECOAUTH in > Java), you'd never be able to reach the 404 state due to consistency checking > with the inbound token. > > Since the intent of the registration access token is that it's bound to a > single instance, its lifecycle is generally tied to the lifecycle begins at > the issuance of a new client_id with that instance. That token might be > revoked and a new one issued on Read and Update requests to the Client > Configuration Endpoint (and the client needs to be prepared for that -- same > as the client_secret), and it will be revoked when the client is deleted > either with a Delete call to the Client Configuration Endpoint or something > happening out-of-band to kill the client. > > Should we add more explanatory text to the definition in the terminology > section? Elsewhere? I'm very open to concrete suggestions with this, since I > don't think it's as clear as we'd like. > >> >> About section 5.1: >> >> Is registration_access_token unique? Or is it shared by multiple instances? >> If shared, then registration_access_token can't be revoked on delete of >> client. >> >> Suggest rename “expires_at” to “client_secret_expires_at”, >> >> Suggest to rename “issued_at” to “id_issued_at” > > While I do like the suggestion of changing these to client_secret_expires_at > and client_id_issued_at, and I think these are more clear and readable, I > don't want to change the syntax during last call unless there is a clear need > and a clear consensus for doing so. > >> >> Section 7 >> >> When a client_secret expires is it the intent that clients do an update or >> refresh to get a new client secret? > > Yes, the client is supposed to either call the read or update methods on the > client configuration endpoint to get its new secret. As discussed above, I'm > not sure that's as clear as it needs to be, and I welcome suggestions on how > to clarify this. > > > > Again, thanks for the very thorough read through. Have you implemented any of > the spec yet, either as-is or with any of your suggested changes? > > -- Justin
_______________________________________________ OAuth mailing list OAuth@ietf.org https://www.ietf.org/mailman/listinfo/oauth