Hannes,

I’ve had a chance to more thoroughly re-read both the drafts and your notes, I 
think you’re actually correct about the IANA registration. We register 
“client_id” and “client_secret”, even though they can’t be requested by the 
client. As such, we do need to register “registration_access_token” and the 
“registration_client_uri” in the registry. We’ll make sure those are in the 
next revision of the document.

 — Justin

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

> 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
> 
> _______________________________________________
> 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