And by “6790” below I obviously mean RFC6749.

(Note to self, don’t write working group emails this early in the morning.)

 — Justin

On Nov 26, 2014, at 8:31 AM, Justin Richer <jric...@mit.edu> wrote:

> 
> On Nov 26, 2014, at 2:35 AM, Hannes Tschofenig <hannes.tschofe...@gmx.net> 
> wrote:
> 
>> Hi Justin,
>> 
>> thanks for your quick response. A few remarks below.
>> 
>> On 11/24/2014 10:11 PM, Richer, Justin P. wrote:
>>> Hannes, thank you for the review. Answers inline.
>>> 
>>> On Nov 24, 2014, at 3:09 PM, Hannes Tschofenig
>>> <hannes.tschofe...@gmx.net> wrote:
>>> 
>>>> Hi Justin, Mike, John, Maciej,
>>>> 
>>>> as part of my shepherd write-up I carefully read through 
>>>> draft-ietf-oauth-dyn-reg-management-05. Overall the document is in
>>>> good shape but I have a few minor clarification questions that
>>>> should be resolved before the document goes to the IESG.
>>>> 
>>>> In Section 1.4. "Registration Tokens and Client Credentials" you
>>>> explain the different credential types and I was wondering why you
>>>> aren't issuing client_secrets to all clients instead of introducing
>>>> another credential, the registration access token. While you try to
>>>> explain the reasons those appear somewhat constructed. For example,
>>>> you say that "not all types of clients have client credentials" but
>>>> you are the author of the specification and you can essentially
>>>> decide what to do. The registration access token is essentially the
>>>> same as the client credential since it is "is uniquely bound to the
>>>> client identifier".
>>>> 
>>>> I believe we have discussed this issue in the past but I don't
>>>> remember what the reasoning was. Can you describe what your design
>>>> rational was (and add it to the document)?
>>> 
>>> That's exactly the question this section is trying to answer, and if
>>> it can be made clearer then please suggest some text that will help
>>> that purpose. The rationale for the registration access token is very
>>> simple: we want to have a means to call the management endpoint in a
>>> protected manner, and treating the management endpoint as an OAuth
>>> Protected Resource makes a lot of sense. RFC6750 gives us the means
>>> to make an authorized call to an API endpoint, so we're re-using that
>>> instead of trying to invent some other mechanism. Shouldn't we be
>>> helping the world get away from API passwords?
>>> 
>>> And it's very true that not every client is going to have a client
>>> secret to use at the token endpoint -- some will have no use of one
>>> (public and implicit clients) and some will be using TLS or
>>> asymmetric keys (JWT assertions, for instance) or other mechanisms to
>>> authenticate that don't involve the secret. Instead of forcing these
>>> clients to use a client secret for one new endpoint, or forcing that
>>> endpoint to potentially support the infinite number of client
>>> authentication mechanisms, we decided to just use OAuth. These are
>>> OAuth clients, remember -- they will *all* have the ability to send
>>> OAuth tokens to a protected resource already built in.
>>> 
>> 
>> Here is the point I don't quite get: the registration access token is
>> essentially the same as a client secret. You as a specification author
>> essentially decides whether clients will get a client secret or a
>> registration access token. It is under your control.
>> 
>> To be more specific, here is what you could have done:
>> 
>> C -> S: Client Registration Request
>> C <- S: Client Information Response (with new client secret)
>> 
>> C -> S: Read or Update Request (with client id/client secret)
>> C <- S: Client Information Response
>> 
>> Instead, you currently have this exchange:
>> 
>> C -> S: Client Registration Request
>> C <- S: Client Information Response (with new reg. access token)
>> 
>> C -> S: Read or Update Request (with client id + reg. access token)
>> C <- S: Client Information Response
>> 
>> Do you see the similarity that I see?
> 
> For clients that use a client secret to authenticate to the token endpoint, 
> your point makes sense, but for clients who would not otherwise have a client 
> secret, it doesn’t. You end up with a confusing state where you’re giving 
> somebody a “client_secret” which is defined in 6790 to be used at the token 
> endpoint but then telling them not to use it at the token endpoint (where 
> they use something else or do’t use it at all) but to use it at this new 
> endpoint instead. Can you see the confusion point here? I think it’s only 
> going to get worse as we get more clients that use auth mechanisms that don’t 
> depend on a shared secret (public key, TLS, etc.). 
> 
> Instead we’re giving people an OAuth access token to access a protected API, 
> something that OAuth clients ought to know how to do anyway. This mechanism 
> also gives us an opportunity to potentially use the new PoP tokens (once 
> they’re actually defined) in place of the bearer credential that’s defined 
> today. 
> 
>> 
>>>> 
>>>> In Section 1.4.1. "Credential Rotation" you write:
>>>> 
>>>> " The Authorization Server MAY rotate the client's registration
>>>> access token and/or client credentials (such as a "client_secret") 
>>>> throughout the lifetime of the client. "
>>>> 
>>>> You might want to add reasons why the authorization server may want
>>>> to take this step.
>>> 
>>> OK, but there's nothing normative here in my view. It's basically up
>>> to the auth server to say "well let's make a new credential". Can you
>>> suggest text that would clarify this?
>>> 
>> 
>> What about making the spec simpler by not allowing credential rotation?
>> Rekying is a useful concept under two circumstances, namely
>> * when they provide a performance improvement (such as it is the case
>> with session resumption in TLS where you can do an abbreviated handshake
>> without all the heavy public key crypto)
>> * when the entrophy of the key is exhausted, which typically happens if
>> you exceed a number of data packets sent under a given key. Often this
>> is tied to the way how freshness is ensured and the need to avoid
>> encrypting data with the same initialization vector/nonce twice.
>> 
>> Neither of these two cases seem to apply here (IMHO).
> 
> 
> Rekeying the client is useful in a whole lot more cases than these two, and 
> most of them boil down to “Something seems fishy”. I think if anything we 
> need to eventually figure out how to do *more* secret rotation, including a 
> proactive mechanism started by the client (as Brian has mentioned, among 
> others). 
> 
>> 
>> 
>>>> 
>>>> There are also a bit too many SHOULDs in the document. Every time
>>>> you write SHOULD you have to keep in mind to tell the reader what
>>>> happens in the other case. For example, in Section Section 1.4.1
>>>> you write:
>>>> 
>>>> " The registration access token SHOULD be rotated only in response
>>>> to an update request to the client configuration endpoint, at
>>>> which point the new registration access token is returned to the
>>>> client and the old registration access token SHOULD be discarded by
>>>> both parties. "
>>>> 
>>>> Here the question arises whether you are using the SHOULD to
>>>> indicate that the authorization server does not always need to
>>>> rotate the registration access token and if he does then is must
>>>> only happen in response to an update request or does it indicate
>>>> that the authorization server could also rotate it in response to
>>>> other calls?
>>> 
>>> It's more that the server SHOULD NOT throw out a registration access
>>> token that a client still thinks is good without some way to
>>> communicate the new token to the client. Think of it this way, you've
>>> got the token, the server decides to chuck it on you -- what do you
>>> do? You can try calling your READ or UPDATE operations to get the new
>>> one but no dice, your token is bad. So what we're saying here is not
>>> to throw out the client's only means of finding out if its keys are
>>> good anymore.
>> 
>> I think I got confused with the description of the state management (as
>> described in the document). There is some fuzziness.
>> 
>> Here I would prefer to have either no rekeying (which would make the
>> issue go away) or a very deterministic way of rekeying.
>> 
>> I prefer the former.
> 
> I’m not a fan of enforcing permanent credentials on the world. And we have 
> the same construct with refresh tokens today, for what it’s worth.
> 
>> 
>>> 
>>>> 
>>>> Also, in the second line one would wonder why the old registration 
>>>> access token isn't mandatorily discarded. If there are good
>>>> reasons, then tell the reader.
>>> 
>>> We've tried to put requirements on the server discarding tokens in
>>> the past, but there was significant pushback from providers who use
>>> non-revocable time-limited tokens. Maybe they won't be doing that
>>> here, for the reason above.
>> 
>> 
>> I wouldn't reflect that in the document. Of course, you can never be
>> sure that the implementation really discards any state but for the
>> purpose of the protocol state machine it is gone.
>> 
>>> 
>>>> Furthermore, the text in Section 2.2 seems to contract this
>>>> statement: " If the authorization server includes a new client
>>>> secret and/or registration access token in its response, the client
>>>> MUST immediately discard its previous client secret and/or
>>>> registration access token. "
>>> 
>>> This is a requirement on the client, not the server, so it's not
>>> bound by the token lifetime restrictions above. We're telling the
>>> client to stop using a secret or token after it's been given a new
>>> one, that's fine.
>> 
>> OK
>> 
>>> 
>>>> In Section 2.2 you write: " However, since read operations are
>>>> intended to be idempotent, the read request itself SHOULD NOT cause
>>>> changes to the client's registered metadata values. "
>>>> 
>>>> I am wondering whether this SHOULD NOT statement adds a lot of
>>>> value since you allow the request to change metadata values.
>>> 
>>> I think you're right, since the metadata values might have changed
>>> through outside forces since the client last read, and all the
>>> clients need to be able to deal with that. We can remove that line.
>> 
>> OK
>> 
>>> 
>>>> You also write the security consideration section: " the
>>>> registration access token MAY be rotated when the developer or
>>>> client does a read or update operation on the client's client
>>>> configuration endpoint. "
>>>> 
>>>> This means that the content of the registration access token may
>>>> also change with a read operation.
>>> 
>>> That's correct.
>>> 
>>>> Terminology:
>>>> 
>>>> Sometimes you write "Client Information Response" and sometimes
>>>> "client information response" The same with "Authorization Server"
>>>> and "authorization server"
>>> 
>>> They're all supposed to be lower cased, as is the style in RFC6749. I
>>> tried to bump everything down in a previous edit but it looks like I
>>> missed some.
>>> 
>>>> Typo:
>>>> 
>>>> " Some values in the response, including the "client_secret" and
>>>> r"egistration_access_token", MAY be ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
>>>> different from those in the initial registration response. "
>>> 
>>> Thanks, noted!
>>> 
>>>> 
>>>> In Section 2.4 "Client Delete Request" you write:
>>>> 
>>>> " The authorization server SHOULD immediately invalidate all
>>>> existing authorization grants and currently-active tokens
>>>> associated with this client. "
>>>> 
>>>> Under what circumstances wouldn't the authorization invalidate all 
>>>> grants and active tokens?
>>> 
>>> When it's using a non-revocable stateless token and it can't
>>> physically do that. Too bad 2119 doesn't have MUST IF POSSIBLE or
>>> equivalent.
>> 
>> Maybe it would be good to add this information.
>> 
>> It might also be worthwhile whether this notion of a non-vocable
>> stateless token actually exists in this context since we are really
>> talking about the same infrastructure here. This registration management
>> mechanism is really very central to the authorization server (unlike
>> some other access token mechanisms where we talk about the resource
>> server, which may be in a different administrative domain even).
> 
> Why doesn’t the existing SHOULD cover this?
> 
>> 
>>> 
>>>> You might also want to say what tokens you are talking about since
>>>> there are at least the following tokens around: - access tokens -
>>>> refresh tokens - registration access tokens - initial access token
>>> 
>>> OK, we can add that.
>>> 
>>>> 
>>>> " If the server does not support the delete method, the server
>>>> MUST respond with an HTTP 405 Not Supported. "
>>>> 
>>>> Why aren't you demanding that the server must support this method? 
>>>> This would essentially mean that there would be some cases where 
>>>> deregistration isn't possible. Of course, there may be the question
>>>> how important deregistration actually is if the registration 
>>>> automatically expires.
>>> 
>>> Because delete is not always an easy operation to implement. The
>>> client should be able to call the endpoint with the DELETE verb and
>>> at least know if it's allowed to do that or not.
>> 
>> Hmmm. I didn't know that the delete method is difficult to implement.
> 
> Depends on your infrastructure and how things get propagated between 
> components.
> 
>> 
>>> 
>>>> 
>>>> You write: " 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 and someone sends a request with a
>>>> random registration access token I am not sure what exactly you
>>>> want to revoke here.
>>> 
>>> It's not the case of a random token, it's the case of a client having
>>> been deleted but using an otherwise valid access token. If the
>>> token's no good, you don't get this far -- you return a 401 as
>>> defined in RFC6750.
>> 
>> I guess it might make sense to add this information.
> 
> It’s already in there, in the paragraph just before the one you quoted:
> 
>    If the registration access token used to make this request is not
>    valid, the server MUST respond with an error as described in OAuth
>    Bearer Token Usage [RFC6750].
> 
> 
>> 
>>> 
>>>> 
>>>> In Section 3.1. "Client Information Response" you state the new
>>>> elements that are returned to the client. While the client_secret
>>>> has an expires_at field the registration_access_token doesn't. Does
>>>> the expiry value of the client_secret_expires_at automatically
>>>> indicate the lifetime of the  registration access token? I think
>>>> so. But what happens if the client_secret is not issued? To make it
>>>> more complicated you write the following text in the security
>>>> consideration section:
>>>> 
>>>> " While the client secret can expire, the registration access
>>>> token SHOULD NOT expire while a client is still actively
>>>> registered. "
>>> 
>>> There isn't a separate expiration for the registration access token
>>> because it's not supposed to unceremoniously expire on a client. It
>>> should be good until it gets rotated out on a future read/update
>>> operation or the client's registration is no good anymore.
>> 
>> I think it might be good to have a small section that explains how state
>> management works.
> 
> Can you suggest text for this beyond the paragraph that’s already there?
> 
>>> 
>>>> 
>>>> The IANA consideration section is empty. Wouldn't it be necessary
>>>> to register 'registration_access_token' and
>>>> 'registration_client_uri' into the OAuth Dynamic Registration
>>>> Client Metadata Registry?
>>> 
>>> No, these are not client metadata. The client can not send these in a
>>> registration request, so they don't need to be in there.
>> 
>> Really?
>> 
>> I thought that the IANA registry created with Section 5.1 of
>> http://tools.ietf.org/html/draft-ietf-oauth-dyn-reg-20 was meant to be
>> used with the Client Registration Request and the Client Registration
>> Response exchange. The  'registration_access_token' and
>> 'registration_client_uri' parameters are used in the response.
>> 
>> Looking again at draft-ietf-oauth-dyn-reg-20 I noticed an inconsistency:
>> The protocol interaction should either be
>> 
>> 
>> C -> AS: Client Registration Request
>> C <- AS: Client Registration Response
>> 
>>            OR
>> 
>> C -> AS: Client Registration Request
>> C <- AS: Client Registration Error Response
>> 
>> Currently, sometimes the term "Client Registration Response" or "Client
>> Information Response" is used. We need to fix this since it spills over
>> to the management API document as well.
> 
> Client Information Response and Client Error Response are sub-classes of 
> Client Registration Response. If that’s not clear from the current document, 
> please suggest new wording to make it clearer.
> 
>> 
>> Also, I noticed that we say that the server MUST support TLS 1.2 RFC
>> 5246 and/or TLS 1.0. We definitely cannot say TLS 1.0 anymore.
> 
> Kathleen made a similar comment on dyn-reg and suggested text that we’ll 
> incorporate (unless there are objections from others on the list).
> 
>> 
>> In Figure 1 it might be useful to indicate that exchanges A, B, C, and D
>> are inherited from the dynamic client registration document and only
>> step D is enhanced with additional parameters, as described in Section
>> 3.1. Furthermore, I wonder whether it would make sense to somehow
>> indicate in the figure that the endpoints are actually part of the
>> Authorization Server.
> 
> While they usually are the same in practice, these endpoints might not be 
> part of the Authorization Server — they might be part of a separate (but 
> related) service that handles objects of various kinds within a security 
> domain. No reason to tie them together unnecessarily. 
> 
>  — Justin
> 
> 
>> 
>> Ciao
>> Hannes
>> 
>>> 
>>> -- Justin
>>> 
>> 
>> _______________________________________________
>> 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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

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

Reply via email to