Return-Path: <jricher@mit.edu>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1])
 by ietfa.amsl.com (Postfix) with ESMTP id 286E41A014D
 for <oauth@ietfa.amsl.com>; Sun, 30 Nov 2014 18:22:08 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.51
X-Spam-Level: 
X-Spam-Status: No, score=-1.51 tagged_above=-999 required=5
 tests=[BAYES_50=0.8, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_MED=-2.3,
 SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44])
 by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id RU55MCIotX1Y for <oauth@ietfa.amsl.com>;
 Sun, 30 Nov 2014 18:22:00 -0800 (PST)
Received: from dmz-mailsec-scanner-6.mit.edu (dmz-mailsec-scanner-6.mit.edu
 [18.7.68.35])
 (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by ietfa.amsl.com (Postfix) with ESMTPS id EE3C91A0055
 for <oauth@ietf.org>; Sun, 30 Nov 2014 18:21:59 -0800 (PST)
X-AuditID: 12074423-f79b86d000000cf5-a6-547bd0c67c4e
Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])
 (using TLS with cipher DHE-RSA-AES256-SHA (256/256 bits))
 (Client did not present a certificate)
 by dmz-mailsec-scanner-6.mit.edu (Symantec Messaging Gateway) with SMTP id
 7A.F0.03317.6C0DB745; Sun, 30 Nov 2014 21:21:58 -0500 (EST)
Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])
 by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id sB12Lv6w008580;
 Sun, 30 Nov 2014 21:21:57 -0500
Received: from artemisia.richer.local
 (static-96-237-195-53.bstnma.fios.verizon.net [96.237.195.53])
 (authenticated bits=0) (User authenticated as jricher@ATHENA.MIT.EDU)
 by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id sB12Lsn4023018
 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT);
 Sun, 30 Nov 2014 21:21:56 -0500
Content-Type: multipart/signed;
 boundary="Apple-Mail=_41375217-C74B-4C13-9A4F-005899761A21";
 protocol="application/pgp-signature"; micalg=pgp-sha1
Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\))
From: Justin Richer <jricher@mit.edu>
In-Reply-To: <4724812B-DA0A-4905-8B2D-E5FC1722DC63@mit.edu>
Date: Sun, 30 Nov 2014 21:21:54 -0500
Message-Id: <4BFAB728-BF73-4213-8CDF-CC5080695C0F@mit.edu>
References: <54739067.3020602@gmx.net>
 <8C669C03-CF70-445C-9FA7-280DE94084A2@mitre.org> <547582B8.5000509@gmx.net>
 <7A200D67-0D5E-4B71-A810-D456B6FDC332@mit.edu>
 <4724812B-DA0A-4905-8B2D-E5FC1722DC63@mit.edu>
To: Hannes Tschofenig <hannes.tschofenig@gmx.net>
X-Mailer: Apple Mail (2.1878.6)
X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrLKsWRmVeSWpSXmKPExsUixG6nonvsQnWIwaz1ghZLd95jtTj59hWb
 A5PH4k372TyWLPnJFMAUxWWTkpqTWZZapG+XwJXRfHQie8GSu0wVE152sjcwXlvC1MXIySEh
 YCLx+eU5NghbTOLCvfVANheHkMBiJomN/zZDORsZJc6ffcUM4dxkkpj29BEriMMsMIlR4tyn
 1awg/bwCBhJLdm1iBrGFBQIl1jfcAZvLJqAqMX1NC9g+TgFriXOLZwDVc3CwAMX3ra8ECTMD
 mV8WvGeCGGMlsX7qPHaIZRcYJd69mQM2U0TAUOL6zOmsELfKS3z4cJx9AqPALGR3zEJyxyyw
 wUkSv/c+YIWwtSWWLXwNFTeQeNr5Cou4vsSbd3OYIGx5ie1v50DFLSUWz7zBAmHbStzqWwBV
 YyfxaNoi1gWM3KsYZVNyq3RzEzNzilOTdYuTE/PyUot0zfRyM0v0UlNKNzGCY85FeQfjn4NK
 hxgFOBiVeHgl5leHCLEmlhVX5h5ilORgUhLlPT0PKMSXlJ9SmZFYnBFfVJqTWnyIUQVo16MN
 qy8wSrHk5eelKonwnvMAquNNSaysSi3KhymT5mBREufd9IMvREggPbEkNTs1tSC1CCYrw8Gh
 JME77TxQo2BRanpqRVpmTglCmomD8xCjBAcP0HAXkBre4oLE3OLMdIj8KUZFKXHepyAJAZBE
 RmkeXC8sVb5iFAd6S5hXG6SKB5hm4bpfAQ1mAhrM0FwJMrgkESEl1cB45PGP/Qrf56x7dEO1
 u+TSMT7JCAZmnZm7J5wK7Uk7cKlEjXNx1I+nqsEt8d8vOGY93B/XKrTT85jZfZHLtgusYo+x
 /kg4sn+Pv9hKj1qHW11GxeuvnNV7uP9g1m7x+Trhn0SlPQwnH4hUUl7F8U85d8/B3zdYl7I/
 Vc7JzuNff+Gb+brNCfMuKLEUZyQaajEXFScCAJU8NIBwAwAA
Archived-At: http://mailarchive.ietf.org/arch/msg/oauth/GwhaL6x79N4JrumsSG7czwTEaPA
Cc: "oauth@ietf.org" <oauth@ietf.org>
Subject: Re: [OAUTH-WG] Shepherd Review of
 draft-ietf-oauth-dyn-reg-management-05
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>,
 <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/oauth/>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>,
 <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 01 Dec 2014 02:22:08 -0000


--Apple-Mail=_41375217-C74B-4C13-9A4F-005899761A21
Content-Type: multipart/alternative;
	boundary="Apple-Mail=_BCB28D54-0A42-40FE-9D33-DB1A54E890EA"


--Apple-Mail=_BCB28D54-0A42-40FE-9D33-DB1A54E890EA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=windows-1252

Hannes,

I=92ve had a chance to more thoroughly re-read both the drafts and your =
notes, I think you=92re actually correct about the IANA registration. We =
register =93client_id=94 and =93client_secret=94, even though they can=92t=
 be requested by the client. As such, we do need to register =
=93registration_access_token=94 and the =93registration_client_uri=94 in =
the registry. We=92ll make sure those are in the next revision of the =
document.

 =97 Justin

On Nov 26, 2014, at 8:32 AM, Justin Richer <jricher@MIT.EDU> wrote:

> And by =936790=94 below I obviously mean RFC6749.
>=20
> (Note to self, don=92t write working group emails this early in the =
morning.)
>=20
>  =97 Justin
>=20
> On Nov 26, 2014, at 8:31 AM, Justin Richer <jricher@MIT.EDU> wrote:
>=20
>>=20
>> On Nov 26, 2014, at 2:35 AM, Hannes Tschofenig =
<hannes.tschofenig@gmx.net> wrote:
>>=20
>>> Hi Justin,
>>>=20
>>> thanks for your quick response. A few remarks below.
>>>=20
>>> On 11/24/2014 10:11 PM, Richer, Justin P. wrote:
>>>> Hannes, thank you for the review. Answers inline.
>>>>=20
>>>> On Nov 24, 2014, at 3:09 PM, Hannes Tschofenig
>>>> <hannes.tschofenig@gmx.net> wrote:
>>>>=20
>>>>> Hi Justin, Mike, John, Maciej,
>>>>>=20
>>>>> as part of my shepherd write-up I carefully read through=20
>>>>> 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.
>>>>>=20
>>>>> 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".
>>>>>=20
>>>>> 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)?
>>>>=20
>>>> 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?
>>>>=20
>>>> 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.
>>>>=20
>>>=20
>>> 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.
>>>=20
>>> To be more specific, here is what you could have done:
>>>=20
>>> C -> S: Client Registration Request
>>> C <- S: Client Information Response (with new client secret)
>>>=20
>>> C -> S: Read or Update Request (with client id/client secret)
>>> C <- S: Client Information Response
>>>=20
>>> Instead, you currently have this exchange:
>>>=20
>>> C -> S: Client Registration Request
>>> C <- S: Client Information Response (with new reg. access token)
>>>=20
>>> C -> S: Read or Update Request (with client id + reg. access token)
>>> C <- S: Client Information Response
>>>=20
>>> Do you see the similarity that I see?
>>=20
>> 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=92t. You end up with a =
confusing state where you=92re giving somebody a =93client_secret=94 =
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=92t use it at all) but to use it at this new =
endpoint instead. Can you see the confusion point here? I think it=92s =
only going to get worse as we get more clients that use auth mechanisms =
that don=92t depend on a shared secret (public key, TLS, etc.).=20
>>=20
>> Instead we=92re 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=92re actually defined) in place of the =
bearer credential that=92s defined today.=20
>>=20
>>>=20
>>>>>=20
>>>>> In Section 1.4.1. "Credential Rotation" you write:
>>>>>=20
>>>>> " The Authorization Server MAY rotate the client's registration
>>>>> access token and/or client credentials (such as a "client_secret")=20=

>>>>> throughout the lifetime of the client. "
>>>>>=20
>>>>> You might want to add reasons why the authorization server may =
want
>>>>> to take this step.
>>>>=20
>>>> 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?
>>>>=20
>>>=20
>>> 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.
>>>=20
>>> Neither of these two cases seem to apply here (IMHO).
>>=20
>>=20
>> Rekeying the client is useful in a whole lot more cases than these =
two, and most of them boil down to =93Something seems fishy=94. 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).=20
>>=20
>>>=20
>>>=20
>>>>>=20
>>>>> 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:
>>>>>=20
>>>>> " 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. "
>>>>>=20
>>>>> 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?
>>>>=20
>>>> 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.
>>>=20
>>> I think I got confused with the description of the state management =
(as
>>> described in the document). There is some fuzziness.
>>>=20
>>> Here I would prefer to have either no rekeying (which would make the
>>> issue go away) or a very deterministic way of rekeying.
>>>=20
>>> I prefer the former.
>>=20
>> I=92m not a fan of enforcing permanent credentials on the world. And =
we have the same construct with refresh tokens today, for what it=92s =
worth.
>>=20
>>>=20
>>>>=20
>>>>>=20
>>>>> Also, in the second line one would wonder why the old registration=20=

>>>>> access token isn't mandatorily discarded. If there are good
>>>>> reasons, then tell the reader.
>>>>=20
>>>> 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.
>>>=20
>>>=20
>>> 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.
>>>=20
>>>>=20
>>>>> 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. "
>>>>=20
>>>> 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.
>>>=20
>>> OK
>>>=20
>>>>=20
>>>>> 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. "
>>>>>=20
>>>>> I am wondering whether this SHOULD NOT statement adds a lot of
>>>>> value since you allow the request to change metadata values.
>>>>=20
>>>> 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.
>>>=20
>>> OK
>>>=20
>>>>=20
>>>>> 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. "
>>>>>=20
>>>>> This means that the content of the registration access token may
>>>>> also change with a read operation.
>>>>=20
>>>> That's correct.
>>>>=20
>>>>> Terminology:
>>>>>=20
>>>>> Sometimes you write "Client Information Response" and sometimes
>>>>> "client information response" The same with "Authorization Server"
>>>>> and "authorization server"
>>>>=20
>>>> 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.
>>>>=20
>>>>> Typo:
>>>>>=20
>>>>> " Some values in the response, including the "client_secret" and
>>>>> r"egistration_access_token", MAY be ^^^^^^^^^^^^^^^^^^^^^^^^^^^=20
>>>>> different from those in the initial registration response. "
>>>>=20
>>>> Thanks, noted!
>>>>=20
>>>>>=20
>>>>> In Section 2.4 "Client Delete Request" you write:
>>>>>=20
>>>>> " The authorization server SHOULD immediately invalidate all
>>>>> existing authorization grants and currently-active tokens
>>>>> associated with this client. "
>>>>>=20
>>>>> Under what circumstances wouldn't the authorization invalidate all=20=

>>>>> grants and active tokens?
>>>>=20
>>>> 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.
>>>=20
>>> Maybe it would be good to add this information.
>>>=20
>>> 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).
>>=20
>> Why doesn=92t the existing SHOULD cover this?
>>=20
>>>=20
>>>>=20
>>>>> 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
>>>>=20
>>>> OK, we can add that.
>>>>=20
>>>>>=20
>>>>> " If the server does not support the delete method, the server
>>>>> MUST respond with an HTTP 405 Not Supported. "
>>>>>=20
>>>>> Why aren't you demanding that the server must support this method?=20=

>>>>> This would essentially mean that there would be some cases where=20=

>>>>> deregistration isn't possible. Of course, there may be the =
question
>>>>> how important deregistration actually is if the registration=20
>>>>> automatically expires.
>>>>=20
>>>> 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.
>>>=20
>>> Hmmm. I didn't know that the delete method is difficult to =
implement.
>>=20
>> Depends on your infrastructure and how things get propagated between =
components.
>>=20
>>>=20
>>>>=20
>>>>>=20
>>>>> 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. "
>>>>>=20
>>>>> 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.
>>>>=20
>>>> 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.
>>>=20
>>> I guess it might make sense to add this information.
>>=20
>> It=92s already in there, in the paragraph just before the one you =
quoted:
>>=20
>>    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].
>>=20
>>=20
>>>=20
>>>>=20
>>>>>=20
>>>>> 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:
>>>>>=20
>>>>> " While the client secret can expire, the registration access
>>>>> token SHOULD NOT expire while a client is still actively
>>>>> registered. "
>>>>=20
>>>> 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.
>>>=20
>>> I think it might be good to have a small section that explains how =
state
>>> management works.
>>=20
>> Can you suggest text for this beyond the paragraph that=92s already =
there?
>>=20
>>>>=20
>>>>>=20
>>>>> 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?
>>>>=20
>>>> 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.
>>>=20
>>> Really?
>>>=20
>>> 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.
>>>=20
>>> Looking again at draft-ietf-oauth-dyn-reg-20 I noticed an =
inconsistency:
>>> The protocol interaction should either be
>>>=20
>>>=20
>>> C -> AS: Client Registration Request
>>> C <- AS: Client Registration Response
>>>=20
>>>            OR
>>>=20
>>> C -> AS: Client Registration Request
>>> C <- AS: Client Registration Error Response
>>>=20
>>> 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.
>>=20
>> Client Information Response and Client Error Response are sub-classes =
of Client Registration Response. If that=92s not clear from the current =
document, please suggest new wording to make it clearer.
>>=20
>>>=20
>>> 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.
>>=20
>> Kathleen made a similar comment on dyn-reg and suggested text that =
we=92ll incorporate (unless there are objections from others on the =
list).
>>=20
>>>=20
>>> 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.
>>=20
>> While they usually are the same in practice, these endpoints might =
not be part of the Authorization Server =97 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.=20=

>>=20
>>  =97 Justin
>>=20
>>=20
>>>=20
>>> Ciao
>>> Hannes
>>>=20
>>>>=20
>>>> -- Justin
>>>>=20
>>>=20
>>> _______________________________________________
>>> OAuth mailing list
>>> OAuth@ietf.org
>>> https://www.ietf.org/mailman/listinfo/oauth
>>=20
>> _______________________________________________
>> OAuth mailing list
>> OAuth@ietf.org
>> https://www.ietf.org/mailman/listinfo/oauth
>=20
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth


--Apple-Mail=_BCB28D54-0A42-40FE-9D33-DB1A54E890EA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=windows-1252

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dwindows-1252"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: =
after-white-space;"><div>Hannes,</div><div><br></div>I=92ve had a chance =
to more thoroughly re-read both the drafts and your notes, I think =
you=92re actually correct about the IANA registration. We register =
=93client_id=94 and =93client_secret=94, even though they can=92t be =
requested by the client. As such, we do need to register =
=93registration_access_token=94 and the =93registration_client_uri=94 in =
the registry. We=92ll make sure those are in the next revision of the =
document.<div><br></div><div>&nbsp;=97 Justin</div><div><br><div><div>On =
Nov 26, 2014, at 8:32 AM, Justin Richer &lt;<a =
href=3D"mailto:jricher@MIT.EDU">jricher@MIT.EDU</a>&gt; wrote:</div><br =
class=3D"Apple-interchange-newline"><blockquote type=3D"cite"><meta =
http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dwindows-1252"><div style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">And by =
=936790=94 below I obviously mean RFC6749.<div><br></div><div>(Note to =
self, don=92t write working group emails this early in the =
morning.)</div><div><br></div><div>&nbsp;=97 =
Justin</div><div><br><div><div>On Nov 26, 2014, at 8:31 AM, Justin =
Richer &lt;<a href=3D"mailto:jricher@MIT.EDU">jricher@MIT.EDU</a>&gt; =
wrote:</div><br class=3D"Apple-interchange-newline"><blockquote =
type=3D"cite"><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dwindows-1252"><div style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: =
after-white-space;"><br><div><div>On Nov 26, 2014, at 2:35 AM, Hannes =
Tschofenig &lt;<a =
href=3D"mailto:hannes.tschofenig@gmx.net">hannes.tschofenig@gmx.net</a>&gt=
; wrote:</div><br class=3D"Apple-interchange-newline"><blockquote =
type=3D"cite">Hi Justin,<br><br>thanks for your quick response. A few =
remarks below.<br><br>On 11/24/2014 10:11 PM, Richer, Justin P. =
wrote:<br><blockquote type=3D"cite">Hannes, thank you for the review. =
Answers inline.<br><br>On Nov 24, 2014, at 3:09 PM, Hannes =
Tschofenig<br>&lt;<a =
href=3D"mailto:hannes.tschofenig@gmx.net">hannes.tschofenig@gmx.net</a>&gt=
; wrote:<br><br><blockquote type=3D"cite">Hi Justin, Mike, John, =
Maciej,<br><br>as part of my shepherd write-up I carefully read through =
<br>draft-ietf-oauth-dyn-reg-management-05. Overall the document is =
in<br>good shape but I have a few minor clarification questions =
that<br>should be resolved before the document goes to the =
IESG.<br><br>In Section 1.4. "Registration Tokens and Client =
Credentials" you<br>explain the different credential types and I was =
wondering why you<br>aren't issuing client_secrets to all clients =
instead of introducing<br>another credential, the registration access =
token. While you try to<br>explain the reasons those appear somewhat =
constructed. For example,<br>you say that "not all types of clients have =
client credentials" but<br>you are the author of the specification and =
you can essentially<br>decide what to do. The registration access token =
is essentially the<br>same as the client credential since it is "is =
uniquely bound to the<br>client identifier".<br><br>I believe we have =
discussed this issue in the past but I don't<br>remember what the =
reasoning was. Can you describe what your design<br>rational was (and =
add it to the document)?<br></blockquote><br>That's exactly the question =
this section is trying to answer, and if<br>it can be made clearer then =
please suggest some text that will help<br>that purpose. The rationale =
for the registration access token is very<br>simple: we want to have a =
means to call the management endpoint in a<br>protected manner, and =
treating the management endpoint as an OAuth<br>Protected Resource makes =
a lot of sense. RFC6750 gives us the means<br>to make an authorized call =
to an API endpoint, so we're re-using that<br>instead of trying to =
invent some other mechanism. Shouldn't we be<br>helping the world get =
away from API passwords?<br><br>And it's very true that not every client =
is going to have a client<br>secret to use at the token endpoint -- some =
will have no use of one<br>(public and implicit clients) and some will =
be using TLS or<br>asymmetric keys (JWT assertions, for instance) or =
other mechanisms to<br>authenticate that don't involve the secret. =
Instead of forcing these<br>clients to use a client secret for one new =
endpoint, or forcing that<br>endpoint to potentially support the =
infinite number of client<br>authentication mechanisms, we decided to =
just use OAuth. These are<br>OAuth clients, remember -- they will *all* =
have the ability to send<br>OAuth tokens to a protected resource already =
built in.<br><br></blockquote><br>Here is the point I don't quite get: =
the registration access token is<br>essentially the same as a client =
secret. You as a specification author<br>essentially decides whether =
clients will get a client secret or a<br>registration access token. It =
is under your control.<br><br>To be more specific, here is what you =
could have done:<br><br>C -&gt; S: Client Registration Request<br>C =
&lt;- S: Client Information Response (with new client secret)<br><br>C =
-&gt; S: Read or Update Request (with client id/client secret)<br>C =
&lt;- S: Client Information Response<br><br>Instead, you currently have =
this exchange:<br><br>C -&gt; S: Client Registration Request<br>C &lt;- =
S: Client Information Response (with new reg. access token)<br><br>C =
-&gt; S: Read or Update Request (with client id + reg. access =
token)<br>C &lt;- S: Client Information Response<br><br>Do you see the =
similarity that I see?<br></blockquote><div><br></div><div>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=92t. You end up with a confusing state where you=92re =
giving somebody a =93client_secret=94 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=92t use it at all) =
but to use it at this new endpoint instead. Can you see the confusion =
point here? I think it=92s only going to get worse as we get more =
clients that use auth mechanisms that don=92t depend on a shared secret =
(public key, TLS, etc.).&nbsp;</div><div><br></div><div>Instead we=92re =
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=92re actually defined) in place of the bearer credential that=92s =
defined today.&nbsp;</div><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><blockquote type=3D"cite"><br>In Section 1.4.1. =
"Credential Rotation" you write:<br><br>" The Authorization Server MAY =
rotate the client's registration<br>access token and/or client =
credentials (such as a "client_secret") <br>throughout the lifetime of =
the client. "<br><br>You might want to add reasons why the authorization =
server may want<br>to take this step.<br></blockquote><br>OK, but =
there's nothing normative here in my view. It's basically up<br>to the =
auth server to say "well let's make a new credential". Can =
you<br>suggest text that would clarify =
this?<br><br></blockquote><br>What about making the spec simpler by not =
allowing credential rotation?<br>Rekying is a useful concept under two =
circumstances, namely<br> * when they provide a performance improvement =
(such as it is the case<br>with session resumption in TLS where you can =
do an abbreviated handshake<br>without all the heavy public key =
crypto)<br> * when the entrophy of the key is exhausted, which typically =
happens if<br>you exceed a number of data packets sent under a given =
key. Often this<br>is tied to the way how freshness is ensured and the =
need to avoid<br>encrypting data with the same initialization =
vector/nonce twice.<br><br>Neither of these two cases seem to apply here =
(IMHO).<br></blockquote><div><br></div><div><br></div><div>Rekeying the =
client is useful in a whole lot more cases than these two, and most of =
them boil down to =93Something seems fishy=94. 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).&nbsp;</div><br><blockquote =
type=3D"cite"><br><br><blockquote type=3D"cite"><blockquote =
type=3D"cite"><br>There are also a bit too many SHOULDs in the document. =
Every time<br>you write SHOULD you have to keep in mind to tell the =
reader what<br>happens in the other case. For example, in Section =
Section 1.4.1<br>you write:<br><br>" The registration access token =
SHOULD be rotated only in response<br>to an update request to the client =
configuration endpoint, at<br>which point the new registration access =
token is returned to the<br>client and the old registration access token =
SHOULD be discarded by<br>both parties. "<br><br>Here the question =
arises whether you are using the SHOULD to<br>indicate that the =
authorization server does not always need to<br>rotate the registration =
access token and if he does then is must<br>only happen in response to =
an update request or does it indicate<br>that the authorization server =
could also rotate it in response to<br>other =
calls?<br></blockquote><br>It's more that the server SHOULD NOT throw =
out a registration access<br>token that a client still thinks is good =
without some way to<br>communicate the new token to the client. Think of =
it this way, you've<br>got the token, the server decides to chuck it on =
you -- what do you<br>do? You can try calling your READ or UPDATE =
operations to get the new<br>one but no dice, your token is bad. So what =
we're saying here is not<br>to throw out the client's only means of =
finding out if its keys are<br>good anymore.<br></blockquote><br>I think =
I got confused with the description of the state management =
(as<br>described in the document). There is some fuzziness.<br><br>Here =
I would prefer to have either no rekeying (which would make the<br>issue =
go away) or a very deterministic way of rekeying.<br><br>I prefer the =
former.<br></blockquote><div><br></div><div>I=92m not a fan of enforcing =
permanent credentials on the world. And we have the same construct with =
refresh tokens today, for what it=92s worth.</div><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><br>Also, in the second line one would wonder why the old =
registration <br>access token isn't mandatorily discarded. If there are =
good<br>reasons, then tell the reader.<br></blockquote><br>We've tried =
to put requirements on the server discarding tokens in<br>the past, but =
there was significant pushback from providers who use<br>non-revocable =
time-limited tokens. Maybe they won't be doing that<br>here, for the =
reason above.<br></blockquote><br><br>I wouldn't reflect that in the =
document. Of course, you can never be<br>sure that the implementation =
really discards any state but for the<br>purpose of the protocol state =
machine it is gone.<br><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite">Furthermore, the text in Section 2.2 seems to contract =
this<br>statement: " If the authorization server includes a new =
client<br>secret and/or registration access token in its response, the =
client<br>MUST immediately discard its previous client secret =
and/or<br>registration access token. "<br></blockquote><br>This is a =
requirement on the client, not the server, so it's not<br>bound by the =
token lifetime restrictions above. We're telling the<br>client to stop =
using a secret or token after it's been given a new<br>one, that's =
fine.<br></blockquote><br>OK<br><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite">In Section 2.2 you write: " =
However, since read operations are<br>intended to be idempotent, the =
read request itself SHOULD NOT cause<br>changes to the client's =
registered metadata values. "<br><br>I am wondering whether this SHOULD =
NOT statement adds a lot of<br>value since you allow the request to =
change metadata values.<br></blockquote><br>I think you're right, since =
the metadata values might have changed<br>through outside forces since =
the client last read, and all the<br>clients need to be able to deal =
with that. We can remove that =
line.<br></blockquote><br>OK<br><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite">You also write the security =
consideration section: " the<br>registration access token MAY be rotated =
when the developer or<br>client does a read or update operation on the =
client's client<br>configuration endpoint. "<br><br>This means that the =
content of the registration access token may<br>also change with a read =
operation.<br></blockquote><br>That's correct.<br><br><blockquote =
type=3D"cite">Terminology:<br><br>Sometimes you write "Client =
Information Response" and sometimes<br>"client information response" The =
same with "Authorization Server"<br>and "authorization =
server"<br></blockquote><br>They're all supposed to be lower cased, as =
is the style in RFC6749. I<br>tried to bump everything down in a =
previous edit but it looks like I<br>missed some.<br><br><blockquote =
type=3D"cite">Typo:<br><br>" Some values in the response, including the =
"client_secret" and<br>r"egistration_access_token", MAY be =
^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br>different from those in the initial =
registration response. "<br></blockquote><br>Thanks, =
noted!<br><br><blockquote type=3D"cite"><br>In Section 2.4 "Client =
Delete Request" you write:<br><br>" The authorization server SHOULD =
immediately invalidate all<br>existing authorization grants and =
currently-active tokens<br>associated with this client. "<br><br>Under =
what circumstances wouldn't the authorization invalidate all <br>grants =
and active tokens?<br></blockquote><br>When it's using a non-revocable =
stateless token and it can't<br>physically do that. Too bad 2119 doesn't =
have MUST IF POSSIBLE or<br>equivalent.<br></blockquote><br>Maybe it =
would be good to add this information.<br><br>It might also be =
worthwhile whether this notion of a non-vocable<br>stateless token =
actually exists in this context since we are really<br>talking about the =
same infrastructure here. This registration management<br>mechanism is =
really very central to the authorization server (unlike<br>some other =
access token mechanisms where we talk about the resource<br>server, =
which may be in a different administrative domain =
even).<br></blockquote><div><br></div><div>Why doesn=92t the existing =
SHOULD cover this?</div><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite">You might also want to say =
what tokens you are talking about since<br>there are at least the =
following tokens around: - access tokens -<br>refresh tokens - =
registration access tokens - initial access =
token<br></blockquote><br>OK, we can add that.<br><br><blockquote =
type=3D"cite"><br>" If the server does not support the delete method, =
the server<br>MUST respond with an HTTP 405 Not Supported. "<br><br>Why =
aren't you demanding that the server must support this method? <br>This =
would essentially mean that there would be some cases where =
<br>deregistration isn't possible. Of course, there may be the =
question<br>how important deregistration actually is if the registration =
<br>automatically expires.<br></blockquote><br>Because delete is not =
always an easy operation to implement. The<br>client should be able to =
call the endpoint with the DELETE verb and<br>at least know if it's =
allowed to do that or not.<br></blockquote><br>Hmmm. I didn't know that =
the delete method is difficult to =
implement.<br></blockquote><div><br></div><div>Depends on your =
infrastructure and how things get propagated between =
components.</div><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite"><br>You write: " If the =
client does not exist on this server, the<br>server MUST respond with =
HTTP 401 Unauthorized and the registration<br>access token used to make =
this request SHOULD be immediately<br>revoked. "<br><br>If the client =
does not exist and someone sends a request with a<br>random registration =
access token I am not sure what exactly you<br>want to revoke =
here.<br></blockquote><br>It's not the case of a random token, it's the =
case of a client having<br>been deleted but using an otherwise valid =
access token. If the<br>token's no good, you don't get this far -- you =
return a 401 as<br>defined in RFC6750.<br></blockquote><br>I guess it =
might make sense to add this =
information.<br></blockquote><div><br></div><div>It=92s already in =
there, in the paragraph just before the one you =
quoted:</div><div><br></div><div><pre class=3D"newpage">   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 [<a href=3D"https://tools.ietf.org/html/rfc6750" =
title=3D"&quot;The OAuth 2.0 Authorization Framework: Bearer Token =
Usage&quot;">RFC6750</a>].
</pre><div><br></div></div><br><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><br><blockquote type=3D"cite"><br>In Section 3.1. "Client =
Information Response" you state the new<br>elements that are returned to =
the client. While the client_secret<br>has an expires_at field the =
registration_access_token doesn't. Does<br>the expiry value of the =
client_secret_expires_at automatically<br>indicate the lifetime of the =
&nbsp;registration access token? I think<br>so. But what happens if the =
client_secret is not issued? To make it<br>more complicated you write =
the following text in the security<br>consideration section:<br><br>" =
While the client secret can expire, the registration access<br>token =
SHOULD NOT expire while a client is still actively<br>registered. =
"<br></blockquote><br>There isn't a separate expiration for the =
registration access token<br>because it's not supposed to =
unceremoniously expire on a client. It<br>should be good until it gets =
rotated out on a future read/update<br>operation or the client's =
registration is no good anymore.<br></blockquote><br>I think it might be =
good to have a small section that explains how state<br>management =
works.<br></blockquote><div><br></div><div>Can you suggest text for this =
beyond the paragraph that=92s already there?</div><br><blockquote =
type=3D"cite"><blockquote type=3D"cite"><br><blockquote =
type=3D"cite"><br>The IANA consideration section is empty. Wouldn't it =
be necessary<br>to register 'registration_access_token' =
and<br>'registration_client_uri' into the OAuth Dynamic =
Registration<br>Client Metadata Registry?<br></blockquote><br>No, these =
are not client metadata. The client can not send these in =
a<br>registration request, so they don't need to be in =
there.<br></blockquote><br>Really?<br><br>I thought that the IANA =
registry created with Section 5.1 of<br><a =
href=3D"http://tools.ietf.org/html/draft-ietf-oauth-dyn-reg-20">http://too=
ls.ietf.org/html/draft-ietf-oauth-dyn-reg-20</a> was meant to be<br>used =
with the Client Registration Request and the Client =
Registration<br>Response exchange. The &nbsp;'registration_access_token' =
and<br>'registration_client_uri' parameters are used in the =
response.<br><br>Looking again at draft-ietf-oauth-dyn-reg-20 I noticed =
an inconsistency:<br>The protocol interaction should either =
be<br><br><br>C -&gt; AS: Client Registration Request<br>C &lt;- AS: =
Client Registration Response<br><br> =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OR<br><b=
r>C -&gt; AS: Client Registration Request<br>C &lt;- AS: Client =
Registration Error Response<br><br>Currently, sometimes the term "Client =
Registration Response" or "Client<br>Information Response" is used. We =
need to fix this since it spills over<br>to the management API document =
as well.<br></blockquote><div><br></div><div>Client Information Response =
and Client Error Response are sub-classes of Client Registration =
Response. If that=92s not clear from the current document, please =
suggest new wording to make it clearer.</div><br><blockquote =
type=3D"cite"><br>Also, I noticed that we say that the server MUST =
support TLS 1.2 RFC<br>5246 and/or TLS 1.0. We definitely cannot say TLS =
1.0 anymore.<br></blockquote><div><br></div><div>Kathleen made a similar =
comment on dyn-reg and suggested text that we=92ll incorporate (unless =
there are objections from others on the list).</div><br><blockquote =
type=3D"cite"><br>In Figure 1 it might be useful to indicate that =
exchanges A, B, C, and D<br>are inherited from the dynamic client =
registration document and only<br>step D is enhanced with additional =
parameters, as described in Section<br>3.1. Furthermore, I wonder =
whether it would make sense to somehow<br>indicate in the figure that =
the endpoints are actually part of the<br>Authorization =
Server.<br></blockquote><div><br></div><div>While they usually are the =
same in practice, these endpoints might not be part of the Authorization =
Server =97 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.&nbsp;</div><div><br></div><div>&nbsp;=97 =
Justin</div><div><br></div><br><blockquote =
type=3D"cite"><br>Ciao<br>Hannes<br><br><blockquote type=3D"cite"><br>-- =
Justin<br><br></blockquote><br>___________________________________________=
____<br>OAuth mailing list<br><a =
href=3D"mailto:OAuth@ietf.org">OAuth@ietf.org</a><br><a =
href=3D"https://www.ietf.org/mailman/listinfo/oauth">https://www.ietf.org/=
mailman/listinfo/oauth</a><br></blockquote></div><br></div>_______________=
________________________________<br>OAuth mailing list<br><a =
href=3D"mailto:OAuth@ietf.org">OAuth@ietf.org</a><br><a =
href=3D"https://www.ietf.org/mailman/listinfo/oauth">https://www.ietf.org/=
mailman/listinfo/oauth</a><br></blockquote></div><br></div></div>_________=
______________________________________<br>OAuth mailing list<br><a =
href=3D"mailto:OAuth@ietf.org">OAuth@ietf.org</a><br>https://www.ietf.org/=
mailman/listinfo/oauth<br></blockquote></div><br></div></body></html>=

--Apple-Mail=_BCB28D54-0A42-40FE-9D33-DB1A54E890EA--

--Apple-Mail=_41375217-C74B-4C13-9A4F-005899761A21
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----

iQEcBAEBAgAGBQJUe9DCAAoJEDPAngkbd+w99TgIAKYEc+nbF7p11Cg9SR43I9sd
sobRj2aY24ARNcTS59vhQq8OK+KjPO1Oi72RwV7q44RDOsvlYFCQcCYsBZ6uCJZ1
KgJreUD1xla43ovCZSsFcUkZtE2EqkYHQk4WKuuh9MjsETJRkoAUGwdX9xvftRoh
DjKgtpORf6cpTNtJ0hODL22Jnk41F/teuozjxcyZ3A/sNTv3ANyWNeEwCaFE0q+K
/hszxl1bsKITF5X9xYp5F/jySE+wj45Ku7vhKidda4MbIaFelVlULHHCieCc2D1/
q4WN4rAcHoQTFZMQbdBcKzacwk0RkFW5chvGY5EstwmDJWNtY0JzYFpTgLI0BI4=
=pvOH
-----END PGP SIGNATURE-----

--Apple-Mail=_41375217-C74B-4C13-9A4F-005899761A21--

