Return-Path: <t.broyer@gmail.com>
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 B3B671A1DE2
 for <oauth@ietfa.amsl.com>; Tue,  2 Dec 2014 09:34:11 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.999
X-Spam-Level: 
X-Spam-Status: No, score=-1.999 tagged_above=-999 required=5
 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
 DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001,
 SPF_PASS=-0.001] 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 gznaHLl6uhPM for <oauth@ietfa.amsl.com>;
 Tue,  2 Dec 2014 09:34:03 -0800 (PST)
Received: from mail-lb0-x22d.google.com (mail-lb0-x22d.google.com
 [IPv6:2a00:1450:4010:c04::22d])
 (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits))
 (No client certificate requested)
 by ietfa.amsl.com (Postfix) with ESMTPS id C84301A1BF8
 for <oauth@ietf.org>; Tue,  2 Dec 2014 09:34:02 -0800 (PST)
Received: by mail-lb0-f173.google.com with SMTP id z12so10899123lbi.18
 for <oauth@ietf.org>; Tue, 02 Dec 2014 09:34:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; 
 h=mime-version:references:from:date:message-id:subject:to
 :content-type; bh=6xubfpdyA5bMEr0LiBJ1Imw7VoPoMyRsrxzYrxeB1k4=;
 b=D86rBwx0FxxRnfTJCdMEsSGAEjc9vKdVuz6WhAwlvPGGRB5UzEM17CAr/y+TVVHpnw
 UkVfuBEPgYSMlXVztKumkx5+HZiyD88jP3Ir1qBHJz3JkCTRFppPqZyZdGcuQ2JhNkHG
 q6zm8efsH5HG2TSv8foR8n2deZy7gbhgRhUMkLB/b2OWxY5UHI9mqlYKw+vq29nyUx0v
 EpTLrzgSh11GRVa7nlmbhjmTg4B7eaNLyPItUnQtN0jIz4UoHfwIyjMZPKfRha9cA2RG
 i9B/FhzCaO5+WOQawpLh7Pe1oyJALQnpz9pouQ/HD92UlG2W29w0Aug7JFDJWyoKDVfw
 Y2Uw==
X-Received: by 10.152.115.230 with SMTP id jr6mr479858lab.2.1417541632371;
 Tue, 02 Dec 2014 09:33:52 -0800 (PST)
MIME-Version: 1.0
References: <547DA128.9090606@gmx.net> <547DC736.5070609@mit.edu>
 <009101d00e54$f099aff0$d1cd0fd0$@reminetworks.com>
From: Thomas Broyer <t.broyer@gmail.com>
Date: Tue, 02 Dec 2014 17:33:51 +0000
Message-ID: <CAEayHEOVQz_WVzZEij6bs+45rig0-d32RaonuMz6FL8BUQDW-A@mail.gmail.com>
To: Donald Coffin <donald.coffin@reminetworks.com>,
 Justin Richer <jricher@mit.edu>, 
 Hannes Tschofenig <hannes.tschofenig@gmx.net>, oauth@ietf.org
Content-Type: multipart/alternative; boundary=001a11c3674273b3a205093f21d7
Archived-At: http://mailarchive.ietf.org/arch/msg/oauth/wj415Kk3xvVxKvEM6i5nHhOg5Zk
Subject: Re: [OAUTH-WG] Review of draft-ietf-oauth-introspection-01
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: Tue, 02 Dec 2014 17:34:11 -0000

--001a11c3674273b3a205093f21d7
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

So what?

The request is OK (no missing parameter, etc.) so a 400 is not appropriate
(it could still be used, but you couldn't tell what went wrong without
*also* having some well-defined error response document format; and an
"invalid_token" error code wouldn't work if you're also using token
authentication passed in the form-encoded body =E2=87=92 too much confusion=
, not
worth it).

401 or 403 are obviously not appropriate either.

I'm +1000 on keeping the 200 OK response with {"active":false} JSON
response.

On Tue Dec 02 2014 at 18:27:03 Donald Coffin <donald.coffin@reminetworks.co=
m>
wrote:

> Hi Justin,
>
>
>
> I believe you will find the answer to which HTTP Status code the AS shoul=
d
> return if the token is INACTIVE in Section 3.1 Error Codes of =E2=80=9CTh=
e OAuth
> 2.0 Framework: Bearer Token Usage=E2=80=9D [RFC6750] which states:
>
>
>
> 3.1.  Error Codes
>
> When a request fails, the resource server responds using the appropriate
> HTTP status code (typically, 400, 401, 403, or 405) and includes one of t=
he
> following error codes in the response:
>
>
>
> *invalid_request*
>
> The request is missing a required parameter, includes an unsupported
> parameter or parameter value, repeats the same parameter, uses more than
> one method for including an access token, or is otherwise malformed. The
> resource server SHOULD respond with the HTTP 400 (Bad Request) status cod=
e.
>
>
>
> *invalid_token*
>
> The access token provided is expired, revoked, malformed, or invalid for
> other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorize=
d)
> status code. The client MAY request a new access token and retry the
> protected resource request.
>
>
>
> *insufficient_scope*
>
> The request requires higher privileges than provided by the access token.
> The resource server SHOULD respond with the HTTP 403 (Forbidden) status
> code and MAY include the scope attribute with the scope necessary to acce=
ss
> the protected resource.
>
>
>
> If the request lacks any authentication information (e.g., the client was
> unaware that authentication is necessary or attempted using an unsupporte=
d
> authentication method), the resource server SHOULD NOT include an error
> code or other error information.
>
>
>
> For example:
>
>   HTTP/1.1 401 Unauthorized  WWW-Authenticate: Bearer realm=3D"example"
>
>
>
>
>
> Best regards,
>
> Don
>
> Donald F. Coffin
>
> Founder/CTO
>
>
>
> REMI Networks
>
> 22751 El Prado Suite 6216
>
> Rancho Santa Margarita, CA  92688-3836
>
>
>
> Phone:      (949) 636-8571
>
> Email:       donald.coffin@reminetworks.com
>
>
>
> *From:* Justin Richer [mailto:jricher@mit.edu]
> *Sent:* Tuesday, December 2, 2014 6:06 AM
> *To:* Hannes Tschofenig; oauth@ietf.org
> *Subject:* Re: [OAUTH-WG] Review of draft-ietf-oauth-introspection-01
>
>
>
> Hannes, thanks for the review. Comments inline.
>
> On 12/2/2014 6:23 AM, Hannes Tschofenig wrote:
>
> Hi Justin,
>
>
>
> I have a few remarks regarding version -01 of the token introspection
>
> document.
>
>
>
> * Terminology
>
>
>
> The token introspection protocol is a client-server protocol but the
>
> term "client" already has a meaning in OAuth. Here the client of the
>
> token introspection protocol is actually the resource server. I believe
>
> it would make sense to clarify this issue in the terminology section or
>
> in the introduction. Maybe add a figure (which you could copy from
>
> Figure 4 of
>
> http://www.ietf.org/id/draft-ietf-oauth-pop-architecture-00.txt.
>
>
>
> Maybe you want to call these two parties, the introspection client and
>
> the introspection server.
>
>
> I tried to avoid the word "client" for this very reason. The draft used t=
o
> say "client or protected resource" throughout, but in a few years of
> deployment experience it's become clear that it's pretty much just
> protected resources that need to do introspection so I changed that text
> throughout. I don't think that "introspection client" will help here
> because the party already has a name from OAuth and we should inherit it.
>
>
> * Scope
>
>
>
> I think the document needs to be very clear that is only applicable to
>
> bearer tokens (and not to PoP tokens). This issue was raised at the last
>
> IETF meeting as well.
>
>
> I think the document should be clear that it *specifies* the mechanism fo=
r
> bearer tokens, since that's the only OAuth token type that's defined
> publicly right now, and that the details for PoP will have to be specifie=
d
> in another spec -- that's exactly what Appendix C is there for, and if th=
at
> can be clearer, please suggest better text.
>
> However, I think it's very clear how PoP tokens would work. You send the
> value returned as the "access_token" in the token endpoint response, whic=
h
> is effectively the public portion of the PoP token. Just like a bearer
> token, this value is passed as-is from the client to the RS and would be
> passed as-is from the RS to the AS during introspection. The AS can then
> use that to look up the key and return it in an as-yet-unspecified field =
so
> that the RS can validate the request. The RS wouldn't send the signature =
or
> signed portion of the request for the AS to validate -- that's a bad idea=
.
> But these are all details that we can work out in the PoP-flavored
> extension. As I noted in the other thread, we'll have to make a similar
> extension for Revocation, so I still don't think it makes sense to hold u=
p
> this work and wait for PoP to be finished because it's useful now, as-is.
>
>
>
>
>
>
> * Meta-Information
>
>
>
> You have replicated a lot of the claims defined in
>
> https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-31
>
> and I am wondering why you have decided to not just re-use the entire
>
> registry from JWT?
>
>
>
> If you want to create a separate registry (which I wouldn't recommend)
>
> then you have to put text into the IANA consideration section.
>
>
> The idea was to inherit JWT's syntax and semantics, at least on the wire,
> and add additional fields. It probably makes sense to just inherit the JW=
T
> registry, so we can do that.
>
>
> When you write:
>
>
>
> "
>
> The endpoint MAY allow other parameters to provide further context to
>
> the query.
>
> "
>
>
>
> You could instead write that the token introspection MUST ignore any
>
> parameters from the request message it does not understand.
>
>
> Noted, will add.
>
>
> Of course, there is the question whether any of those would be security
>
> critical and hence ignoring them would cause problems?!
>
>
> Anything security critical would be provider-specific, in which case it
> wouldn't ignore them.
>
>
> * Security
>
>
>
> The requirement for authenticating the party issuing the introspection
>
> request to the token introspection endpoint is justified in the security
>
> and the privacy consideration section. The security threat is that an
>
> attacker could use the endpoint to testing for tokens. The privacy
>
> threat is that a resource server learns about the content of the token,
>
> which may contain personal data. I see the former as more dangerous than
>
> the latter since a legitimate resource server is supposed to learn about
>
> the authorization information in the token. An attacker who had gotten
>
> hold of tokens will not only learn about the content of the token but he
>
> will also be able to use it to get access to the protected resource itsel=
f.
>
>
>
> In any case, to me this sounds like mutual authentication should be
>
> mandatory to implement. This is currently not the case. On top of that
>
> there is single technique mandatory-to-implement outlined either (in
>
> case someone wants to use it). That's in general not very helpful from
>
> an interoperability point of view. Yet another thing to agree on between
>
> the AS and the RS.
>
>
> I had similar thoughts when putting draft -01 together but didn't want to
> make a normative change like that without the WG input. I'm fine with
> strengthening this to a MUST, since as far as I'm aware that's how it wor=
ks
> in all existing implementations (can anyone else comment on this?). I'm
> less comfortable with making one particular mechanism MTI, since I know o=
f
> implementations that use either a special set of credentials passed just
> like client credentials to the token endpoint, or an OAuth token
> specifically for the introspection endpoint. If we do standardize on one
> MTI form, I'd suggest that we make it the OAuth bearer token.
>
>
> * SHOULDs
>
>
>
> This is my usual comment that any SHOULD statement should give the
>
> reader enough information about the trade-off decision he has to make.
>
> When should he implement something and when should he skip it?
>
>
> Noted, thanks.
>
>
> * Minor items
>
>
>
> You write:
>
>
>
> "
>
> These include using
>
>    structured token formats such as JWT [JWT] or SAML [[ Editor's Note:
>
>    Which SAML document should we reference here? ]] and proprietary
>
>    inter-service communication mechanisms (such as shared databases and
>
>    protected enterprise service buses) that convey token information.
>
> "
>
>
>
> Just reference the JWT since that's what we standardize.
>
>
> I'm fine with that, didn't want to offend the SAML cabal but we can cut i=
t.
>
>
> * 'Active' claim
>
>
>
> you write:
>
> "
>
>    active  REQUIRED.  Boolean indicator of whether or not the presented
>
>       token is currently active.  The authorization server determines
>
>       whether and when a given token is in an active state.
>
> "
>
>
>
> Wouldn't it make more sense to return an error rather than saying that
>
> this token is not active.
>
>
> It's not an error, really. It's a valid request and valid response saying
> that token isn't any good. It would be easy enough to change the returned
> error code on the {active:false} response, but to which code? The request
> isn't Forbidden, or Not Found (the token could have been found but it's
> been deactivated or just not available to the RS that's asking for it), o=
r
> Unauthorized, or even a Bad Request. So my logic is that the response is
> "OK", but the content of the response tells you the metadata about the
> token, which is that it's not active.
>
>
> * Capitalization
>
>
>
> Reading through the text I see bearer token/Bearer Token, Client/client,
>
> etc. issue.
>
>
> Thanks, still breaking old Bad Habits of capitalizing Terms In The
> Document. Tried to clean it up, will do more.
>
>
> * AS <-> RS relationship
>
>
>
> You write:
>
> "
>
>    Since
>
>    OAuth 2.0 [RFC6749] defines no direct relationship between the
>
>    authorization server and the protected resource, only that they must
>
>    have an agreement on the tokens themselves, there have been many
>
>    different approaches to bridging this gap.
>
> "
>
>
>
> I am not sure what you mean by "defines no relationship" between the AS
>
> and the RS. Of course, there is a relationship. The AS issues tokens for
>
> access for a specific RS. The RS needs to understand the tokens or if it
>
> does not understand them it needs to know which AS to interact with to
>
> learn about the content.
>
>
>
> In a nutshell, I am not sure what you want to say with this paragraph
>
> particularly since you state that they have to have an agreement about
>
> the tokens.
>
>
> What I was trying to point out is that it doesn't define the nature of th=
e
> relationship between the two components. Specifically, it says:
>
>    The methods used by the resource
>
>    server to validate the access token (as well as any error responses)
>
>    are beyond the scope of this specification but generally involve an
>
>    interaction or coordination between the resource server and the
>
>    authorization server.
>
> This spec provides one mechanism for this validation. So we could
> reference this directly if that's helpful.
>
>   -- Justin
>
>
>
>
>
>
>
>
> Ciao
>
> Hannes
>
>
>
>
>
>
> _______________________________________________
>
> 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
>

--001a11c3674273b3a205093f21d7
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

So what?<br><br><div>The request is OK (no missing parameter, etc.) so a 40=
0 is not appropriate (it could still be used, but you couldn&#39;t tell wha=
t went wrong without *also* having some well-defined error response documen=
t format; and an &quot;invalid_token&quot; error code wouldn&#39;t work if =
you&#39;re also using token authentication passed in the form-encoded body =
=E2=87=92 too much confusion, not worth it).</div><div><br></div><div>401 o=
r 403 are obviously not appropriate either.</div><div><br></div><div>I&#39;=
m=C2=A0+1000 on keeping the 200 OK response with {&quot;active&quot;:false}=
 JSON response.</div><br><div class=3D"gmail_quote">On Tue Dec 02 2014 at 1=
8:27:03 Donald Coffin &lt;<a href=3D"mailto:donald.coffin@reminetworks.com"=
>donald.coffin@reminetworks.com</a>&gt; wrote:<br><blockquote class=3D"gmai=
l_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left=
:1ex"><div bgcolor=3D"white" lang=3D"EN-US" link=3D"blue" vlink=3D"purple">=
<div><p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&qu=
ot;Calibri&quot;,sans-serif;color:#1f497d">Hi Justin,<u></u><u></u></span><=
/p><p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot=
;Calibri&quot;,sans-serif;color:#1f497d"><u></u>=C2=A0<u></u></span></p><p =
class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Calib=
ri&quot;,sans-serif;color:#1f497d">I believe you will find the answer to wh=
ich HTTP Status code the AS should return if the token is INACTIVE in Secti=
on 3.1 Error Codes of =E2=80=9CThe OAuth 2.0 Framework: Bearer Token Usage=
=E2=80=9D [RFC6750] which states:<u></u><u></u></span></p><p class=3D"MsoNo=
rmal"><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-=
serif;color:#1f497d"><u></u>=C2=A0<u></u></span></p><p class=3D"MsoNormal" =
style=3D"margin-left:1.0in"><span style=3D"font-size:11.0pt;font-family:&qu=
ot;Calibri&quot;,sans-serif;color:#1f497d">3.1.=C2=A0 Error Codes<u></u><u>=
</u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><span sty=
le=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f=
497d">When a request fails, the resource server responds using the appropri=
ate HTTP status code (typically, 400, 401, 403, or 405) and includes one of=
 the following error codes in the response:<u></u><u></u></span></p><p clas=
s=3D"MsoNormal" style=3D"margin-left:1.0in"><span style=3D"font-size:11.0pt=
;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d"><u></u>=C2=A0<u>=
</u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><b><span =
style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:=
#1f497d">invalid_request</span></b><span style=3D"font-size:11.0pt;font-fam=
ily:&quot;Calibri&quot;,sans-serif;color:#1f497d"> <u></u><u></u></span></p=
><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><span style=3D"font-siz=
e:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d">The requ=
est is missing a required parameter, includes an unsupported parameter or p=
arameter value, repeats the same parameter, uses more than one method for i=
ncluding an access token, or is otherwise malformed. The resource server SH=
OULD respond with the HTTP 400 (Bad Request) status code.<u></u><u></u></sp=
an></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><span style=3D"fo=
nt-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d"><u=
></u>=C2=A0<u></u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.=
0in"><b><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,san=
s-serif;color:#1f497d">invalid_token</span></b><span style=3D"font-size:11.=
0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d"> <u></u><u></=
u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><span style=
=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f49=
7d">The access token provided is expired, revoked, malformed, or invalid fo=
r other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorize=
d) status code. The client MAY request a new access token and retry the pro=
tected resource request. <u></u><u></u></span></p><p class=3D"MsoNormal" st=
yle=3D"margin-left:1.0in"><span style=3D"font-size:11.0pt;font-family:&quot=
;Calibri&quot;,sans-serif;color:#1f497d"><u></u>=C2=A0<u></u></span></p><p =
class=3D"MsoNormal" style=3D"margin-left:1.0in"><b><span style=3D"font-size=
:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d">insuffici=
ent_scope</span></b><span style=3D"font-size:11.0pt;font-family:&quot;Calib=
ri&quot;,sans-serif;color:#1f497d"> <u></u><u></u></span></p><p class=3D"Ms=
oNormal" style=3D"margin-left:1.0in"><span style=3D"font-size:11.0pt;font-f=
amily:&quot;Calibri&quot;,sans-serif;color:#1f497d">The request requires hi=
gher privileges than provided by the access token. The resource server SHOU=
LD respond with the HTTP 403 (Forbidden) status code and MAY include the sc=
ope attribute with the scope necessary to access the protected resource.<u>=
</u><u></u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><s=
pan style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;co=
lor:#1f497d"><u></u>=C2=A0<u></u></span></p><p class=3D"MsoNormal" style=3D=
"margin-left:1.0in"><span style=3D"font-size:11.0pt;font-family:&quot;Calib=
ri&quot;,sans-serif;color:#1f497d">If the request lacks any authentication =
information (e.g., the client was unaware that authentication is necessary =
or attempted using an unsupported authentication method), the resource serv=
er SHOULD NOT include an error code or other error information.<u></u><u></=
u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><span style=
=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f49=
7d"><u></u>=C2=A0<u></u></span></p><p class=3D"MsoNormal" style=3D"margin-l=
eft:1.0in"><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,=
sans-serif;color:#1f497d">For example:<u></u><u></u></span></p><p class=3D"=
MsoNormal" style=3D"margin-left:1.0in"><span style=3D"font-size:11.0pt;font=
-family:&quot;Calibri&quot;,sans-serif;color:#1f497d">=C2=A0 HTTP/1.1 401 U=
nauthorized=C2=A0 WWW-Authenticate: Bearer realm=3D&quot;example&quot;<u></=
u><u></u></span></p><p class=3D"MsoNormal" style=3D"margin-left:1.0in"><spa=
n style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;colo=
r:#1f497d"><u></u>=C2=A0<u></u></span></p><p class=3D"MsoNormal"><span styl=
e=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f4=
97d"><u></u>=C2=A0<u></u></span></p><div><p class=3D"MsoNormal"><span style=
=3D"font-family:&quot;Calibri&quot;,sans-serif">Best regards,</span><span s=
tyle=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif"><u></u=
><u></u></span></p><p class=3D"MsoNormal"><span style=3D"font-size:24.0pt;f=
ont-family:&quot;Brush Script MT&quot;">Don</span><span style=3D"font-size:=
11.0pt;font-family:&quot;Calibri&quot;,sans-serif"><u></u><u></u></span></p=
><p class=3D"MsoNormal"><span style=3D"font-family:&quot;Calibri&quot;,sans=
-serif">Donald F. Coffin</span><span style=3D"font-size:11.0pt;font-family:=
&quot;Calibri&quot;,sans-serif"><u></u><u></u></span></p><p class=3D"MsoNor=
mal"><span style=3D"font-family:&quot;Calibri&quot;,sans-serif">Founder/CTO=
</span><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans=
-serif"><u></u><u></u></span></p><p class=3D"MsoNormal"><span style=3D"font=
-family:&quot;Calibri&quot;,sans-serif">=C2=A0</span><span style=3D"font-si=
ze:11.0pt;font-family:&quot;Calibri&quot;,sans-serif"><u></u><u></u></span>=
</p><p class=3D"MsoNormal"><span style=3D"font-family:&quot;Calibri&quot;,s=
ans-serif">REMI Networks</span><span style=3D"font-size:11.0pt;font-family:=
&quot;Calibri&quot;,sans-serif"><u></u><u></u></span></p><p class=3D"MsoNor=
mal"><span style=3D"font-family:&quot;Calibri&quot;,sans-serif">22751 El Pr=
ado Suite 6216</span><span style=3D"font-size:11.0pt;font-family:&quot;Cali=
bri&quot;,sans-serif"><u></u><u></u></span></p><p class=3D"MsoNormal"><span=
 style=3D"font-family:&quot;Calibri&quot;,sans-serif">Rancho Santa Margarit=
a, CA=C2=A0 92688-3836</span><span style=3D"font-size:11.0pt;font-family:&q=
uot;Calibri&quot;,sans-serif"><u></u><u></u></span></p><p class=3D"MsoNorma=
l"><span style=3D"font-family:&quot;Calibri&quot;,sans-serif">=C2=A0</span>=
<span style=3D"font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif"=
><u></u><u></u></span></p><p class=3D"MsoNormal"><span style=3D"font-family=
:&quot;Calibri&quot;,sans-serif">Phone:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (949)=
 636-8571</span><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&q=
uot;,sans-serif"><u></u><u></u></span></p><p class=3D"MsoNormal"><span styl=
e=3D"font-family:&quot;Calibri&quot;,sans-serif">Email:=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 <a href=3D"mailto:donald.coffin@reminetworks.com" target=
=3D"_blank">donald.coffin@reminetworks.com</a></span><span style=3D"font-si=
ze:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d"><u></u>=
<u></u></span></p></div><p class=3D"MsoNormal"><span style=3D"font-size:11.=
0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1f497d"><u></u>=C2=A0=
<u></u></span></p><div><div style=3D"border:none;border-top:solid #e1e1e1 1=
.0pt;padding:3.0pt 0in 0in 0in"><p class=3D"MsoNormal"><b><span style=3D"fo=
nt-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:windowtext"=
>From:</span></b><span style=3D"font-size:11.0pt;font-family:&quot;Calibri&=
quot;,sans-serif;color:windowtext"> Justin Richer [mailto:<a href=3D"mailto=
:jricher@mit.edu" target=3D"_blank">jricher@mit.edu</a>] <br><b>Sent:</b> T=
uesday, December 2, 2014 6:06 AM<br><b>To:</b> Hannes Tschofenig; <a href=
=3D"mailto:oauth@ietf.org" target=3D"_blank">oauth@ietf.org</a><br><b>Subje=
ct:</b> Re: [OAUTH-WG] Review of draft-ietf-oauth-introspection-01<u></u><u=
></u></span></p></div></div></div></div><div bgcolor=3D"white" lang=3D"EN-U=
S" link=3D"blue" vlink=3D"purple"><div><p class=3D"MsoNormal"><u></u>=C2=A0=
<u></u></p><div><p class=3D"MsoNormal">Hannes, thanks for the review. Comme=
nts inline.<br><br>On 12/2/2014 6:23 AM, Hannes Tschofenig wrote:<u></u><u>=
</u></p></div><blockquote style=3D"margin-top:5.0pt;margin-bottom:5.0pt"><p=
re>Hi Justin,<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>I have=
 a few remarks regarding version -01 of the token introspection<u></u><u></=
u></pre><pre>document.<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><p=
re>* Terminology<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>The=
 token introspection protocol is a client-server protocol but the<u></u><u>=
</u></pre><pre>term &quot;client&quot; already has a meaning in OAuth. Here=
 the client of the<u></u><u></u></pre><pre>token introspection protocol is =
actually the resource server. I believe<u></u><u></u></pre><pre>it would ma=
ke sense to clarify this issue in the terminology section or<u></u><u></u><=
/pre><pre>in the introduction. Maybe add a figure (which you could copy fro=
m<u></u><u></u></pre><pre>Figure 4 of<u></u><u></u></pre><pre><a href=3D"ht=
tp://www.ietf.org/id/draft-ietf-oauth-pop-architecture-00.txt" target=3D"_b=
lank">http://www.ietf.org/id/draft-ietf-oauth-pop-architecture-00.txt</a>.<=
u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>Maybe you want to ca=
ll these two parties, the introspection client and<u></u><u></u></pre><pre>=
the introspection server.<u></u><u></u></pre></blockquote><p class=3D"MsoNo=
rmal"><br>I tried to avoid the word &quot;client&quot; for this very reason=
. The draft used to say &quot;client or protected resource&quot; throughout=
, but in a few years of deployment experience it&#39;s become clear that it=
&#39;s pretty much just protected resources that need to do introspection s=
o I changed that text throughout. I don&#39;t think that &quot;introspectio=
n client&quot; will help here because the party already has a name from OAu=
th and we should inherit it.<br><br><br><u></u><u></u></p><blockquote style=
=3D"margin-top:5.0pt;margin-bottom:5.0pt"><pre>* Scope<u></u><u></u></pre><=
pre><u></u>=C2=A0<u></u></pre><pre>I think the document needs to be very cl=
ear that is only applicable to<u></u><u></u></pre><pre>bearer tokens (and n=
ot to PoP tokens). This issue was raised at the last<u></u><u></u></pre><pr=
e>IETF meeting as well.<u></u><u></u></pre></blockquote><p class=3D"MsoNorm=
al"><br>I think the document should be clear that it *specifies* the mechan=
ism for bearer tokens, since that&#39;s the only OAuth token type that&#39;=
s defined publicly right now, and that the details for PoP will have to be =
specified in another spec -- that&#39;s exactly what Appendix C is there fo=
r, and if that can be clearer, please suggest better text.<br><br>However, =
I think it&#39;s very clear how PoP tokens would work. You send the value r=
eturned as the &quot;access_token&quot; in the token endpoint response, whi=
ch is effectively the public portion of the PoP token. Just like a bearer t=
oken, this value is passed as-is from the client to the RS and would be pas=
sed as-is from the RS to the AS during introspection. The AS can then use t=
hat to look up the key and return it in an as-yet-unspecified field so that=
 the RS can validate the request. The RS wouldn&#39;t send the signature or=
 signed portion of the request for the AS to validate -- that&#39;s a bad i=
dea. But these are all details that we can work out in the PoP-flavored ext=
ension. As I noted in the other thread, we&#39;ll have to make a similar ex=
tension for Revocation, so I still don&#39;t think it makes sense to hold u=
p this work and wait for PoP to be finished because it&#39;s useful now, as=
-is.<br><br><br><u></u><u></u></p><blockquote style=3D"margin-top:5.0pt;mar=
gin-bottom:5.0pt"><pre><u></u>=C2=A0<u></u></pre><pre><u></u>=C2=A0<u></u><=
/pre><pre>* Meta-Information<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></=
pre><pre>You have replicated a lot of the claims defined in<u></u><u></u></=
pre><pre><a href=3D"https://tools.ietf.org/html/draft-ietf-oauth-json-web-t=
oken-31" target=3D"_blank">https://tools.ietf.org/html/draft-ietf-oauth-jso=
n-web-token-31</a><u></u><u></u></pre><pre>and I am wondering why you have =
decided to not just re-use the entire<u></u><u></u></pre><pre>registry from=
 JWT?<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>If you want to=
 create a separate registry (which I wouldn&#39;t recommend)<u></u><u></u><=
/pre><pre>then you have to put text into the IANA consideration section.<u>=
</u><u></u></pre></blockquote><p class=3D"MsoNormal"><br>The idea was to in=
herit JWT&#39;s syntax and semantics, at least on the wire, and add additio=
nal fields. It probably makes sense to just inherit the JWT registry, so we=
 can do that.<br><br><br><u></u><u></u></p><blockquote style=3D"margin-top:=
5.0pt;margin-bottom:5.0pt"><pre>When you write:<u></u><u></u></pre><pre><u>=
</u>=C2=A0<u></u></pre><pre>&quot;<u></u><u></u></pre><pre>The endpoint MAY=
 allow other parameters to provide further context to<u></u><u></u></pre><p=
re>the query.<u></u><u></u></pre><pre>&quot;<u></u><u></u></pre><pre><u></u=
>=C2=A0<u></u></pre><pre>You could instead write that the token introspecti=
on MUST ignore any<u></u><u></u></pre><pre>parameters from the request mess=
age it does not understand.<u></u><u></u></pre></blockquote><p class=3D"Mso=
Normal"><br>Noted, will add.<br><br><br><u></u><u></u></p><blockquote style=
=3D"margin-top:5.0pt;margin-bottom:5.0pt"><pre>Of course, there is the ques=
tion whether any of those would be security<u></u><u></u></pre><pre>critica=
l and hence ignoring them would cause problems?!<u></u><u></u></pre></block=
quote><p class=3D"MsoNormal"><br>Anything security critical would be provid=
er-specific, in which case it wouldn&#39;t ignore them. <br><br><br><u></u>=
<u></u></p><blockquote style=3D"margin-top:5.0pt;margin-bottom:5.0pt"><pre>=
* Security<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>The requi=
rement for authenticating the party issuing the introspection<u></u><u></u>=
</pre><pre>request to the token introspection endpoint is justified in the =
security<u></u><u></u></pre><pre>and the privacy consideration section. The=
 security threat is that an<u></u><u></u></pre><pre>attacker could use the =
endpoint to testing for tokens. The privacy<u></u><u></u></pre><pre>threat =
is that a resource server learns about the content of the token,<u></u><u><=
/u></pre><pre>which may contain personal data. I see the former as more dan=
gerous than<u></u><u></u></pre><pre>the latter since a legitimate resource =
server is supposed to learn about<u></u><u></u></pre><pre>the authorization=
 information in the token. An attacker who had gotten<u></u><u></u></pre><p=
re>hold of tokens will not only learn about the content of the token but he=
<u></u><u></u></pre><pre>will also be able to use it to get access to the p=
rotected resource itself.<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre=
><pre>In any case, to me this sounds like mutual authentication should be<u=
></u><u></u></pre><pre>mandatory to implement. This is currently not the ca=
se. On top of that<u></u><u></u></pre><pre>there is single technique mandat=
ory-to-implement outlined either (in<u></u><u></u></pre><pre>case someone w=
ants to use it). That&#39;s in general not very helpful from<u></u><u></u><=
/pre><pre>an interoperability point of view. Yet another thing to agree on =
between<u></u><u></u></pre><pre>the AS and the RS.<u></u><u></u></pre></blo=
ckquote><p class=3D"MsoNormal"><br>I had similar thoughts when putting draf=
t -01 together but didn&#39;t want to make a normative change like that wit=
hout the WG input. I&#39;m fine with strengthening this to a MUST, since as=
 far as I&#39;m aware that&#39;s how it works in all existing implementatio=
ns (can anyone else comment on this?). I&#39;m less comfortable with making=
 one particular mechanism MTI, since I know of implementations that use eit=
her a special set of credentials passed just like client credentials to the=
 token endpoint, or an OAuth token specifically for the introspection endpo=
int. If we do standardize on one MTI form, I&#39;d suggest that we make it =
the OAuth bearer token.<br><br><br><u></u><u></u></p><blockquote style=3D"m=
argin-top:5.0pt;margin-bottom:5.0pt"><pre>* SHOULDs<u></u><u></u></pre><pre=
><u></u>=C2=A0<u></u></pre><pre>This is my usual comment that any SHOULD st=
atement should give the<u></u><u></u></pre><pre>reader enough information a=
bout the trade-off decision he has to make.<u></u><u></u></pre><pre>When sh=
ould he implement something and when should he skip it?<u></u><u></u></pre>=
</blockquote><p class=3D"MsoNormal"><br>Noted, thanks. <br><br><br><u></u><=
u></u></p><blockquote style=3D"margin-top:5.0pt;margin-bottom:5.0pt"><pre>*=
 Minor items<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>You wri=
te:<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>&quot;<u></u><u>=
</u></pre><pre>These include using<u></u><u></u></pre><pre>=C2=A0=C2=A0 str=
uctured token formats such as JWT [JWT] or SAML [[ Editor&#39;s Note:<u></u=
><u></u></pre><pre>=C2=A0=C2=A0 Which SAML document should we reference her=
e? ]] and proprietary<u></u><u></u></pre><pre>=C2=A0=C2=A0 inter-service co=
mmunication mechanisms (such as shared databases and<u></u><u></u></pre><pr=
e>=C2=A0=C2=A0 protected enterprise service buses) that convey token inform=
ation.<u></u><u></u></pre><pre>&quot;<u></u><u></u></pre><pre><u></u>=C2=A0=
<u></u></pre><pre>Just reference the JWT since that&#39;s what we standardi=
ze.<u></u><u></u></pre></blockquote><p class=3D"MsoNormal"><br>I&#39;m fine=
 with that, didn&#39;t want to offend the SAML cabal but we can cut it.<br>=
<br><br><u></u><u></u></p><blockquote style=3D"margin-top:5.0pt;margin-bott=
om:5.0pt"><pre>* &#39;Active&#39; claim<u></u><u></u></pre><pre><u></u>=C2=
=A0<u></u></pre><pre>you write:<u></u><u></u></pre><pre>&quot;<u></u><u></u=
></pre><pre>=C2=A0=C2=A0 active=C2=A0 REQUIRED.=C2=A0 Boolean indicator of =
whether or not the presented<u></u><u></u></pre><pre>=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 token is currently active.=C2=A0 The authorization server determi=
nes<u></u><u></u></pre><pre>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 whether and when=
 a given token is in an active state.<u></u><u></u></pre><pre>&quot;<u></u>=
<u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>Wouldn&#39;t it make more =
sense to return an error rather than saying that<u></u><u></u></pre><pre>th=
is token is not active.<u></u><u></u></pre></blockquote><p class=3D"MsoNorm=
al"><br>It&#39;s not an error, really. It&#39;s a valid request and valid r=
esponse saying that token isn&#39;t any good. It would be easy enough to ch=
ange the returned error code on the {active:false} response, but to which c=
ode? The request isn&#39;t Forbidden, or Not Found (the token could have be=
en found but it&#39;s been deactivated or just not available to the RS that=
&#39;s asking for it), or Unauthorized, or even a Bad Request. So my logic =
is that the response is &quot;OK&quot;, but the content of the response tel=
ls you the metadata about the token, which is that it&#39;s not active. <br=
><br><br><u></u><u></u></p><blockquote style=3D"margin-top:5.0pt;margin-bot=
tom:5.0pt"><pre>* Capitalization<u></u><u></u></pre><pre><u></u>=C2=A0<u></=
u></pre><pre>Reading through the text I see bearer token/Bearer Token, Clie=
nt/client,<u></u><u></u></pre><pre>etc. issue.<u></u><u></u></pre></blockqu=
ote><p class=3D"MsoNormal"><br>Thanks, still breaking old Bad Habits of cap=
italizing Terms In The Document. Tried to clean it up, will do more.<br><br=
><br><u></u><u></u></p><blockquote style=3D"margin-top:5.0pt;margin-bottom:=
5.0pt"><pre>* AS &lt;-&gt; RS relationship<u></u><u></u></pre><pre><u></u>=
=C2=A0<u></u></pre><pre>You write:<u></u><u></u></pre><pre>&quot;<u></u><u>=
</u></pre><pre>=C2=A0=C2=A0 Since<u></u><u></u></pre><pre>=C2=A0=C2=A0 OAut=
h 2.0 [RFC6749] defines no direct relationship between the<u></u><u></u></p=
re><pre>=C2=A0=C2=A0 authorization server and the protected resource, only =
that they must<u></u><u></u></pre><pre>=C2=A0=C2=A0 have an agreement on th=
e tokens themselves, there have been many<u></u><u></u></pre><pre>=C2=A0=C2=
=A0 different approaches to bridging this gap.<u></u><u></u></pre><pre>&quo=
t;<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>I am not sure wha=
t you mean by &quot;defines no relationship&quot; between the AS<u></u><u><=
/u></pre><pre>and the RS. Of course, there is a relationship. The AS issues=
 tokens for<u></u><u></u></pre><pre>access for a specific RS. The RS needs =
to understand the tokens or if it<u></u><u></u></pre><pre>does not understa=
nd them it needs to know which AS to interact with to<u></u><u></u></pre><p=
re>learn about the content.<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></p=
re><pre>In a nutshell, I am not sure what you want to say with this paragra=
ph<u></u><u></u></pre><pre>particularly since you state that they have to h=
ave an agreement about<u></u><u></u></pre><pre>the tokens.<u></u><u></u></p=
re></blockquote><p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><br>W=
hat I was trying to point out is that it doesn&#39;t define the nature of t=
he relationship between the two components. Specifically, it says:<u></u><u=
></u></p><pre>=C2=A0=C2=A0 The methods used by the resource<u></u><u></u></=
pre><pre>=C2=A0=C2=A0 server to validate the access token (as well as any e=
rror responses)<u></u><u></u></pre><pre>=C2=A0=C2=A0 are beyond the scope o=
f this specification but generally involve an<u></u><u></u></pre><pre>=C2=
=A0=C2=A0 interaction or coordination between the resource server and the<u=
></u><u></u></pre><pre>=C2=A0=C2=A0 authorization server.<u></u><u></u></pr=
e><p class=3D"MsoNormal">This spec provides one mechanism for this validati=
on. So we could reference this directly if that&#39;s helpful. <br><br>=C2=
=A0 -- Justin<br><br><br><u></u><u></u></p><blockquote style=3D"margin-top:=
5.0pt;margin-bottom:5.0pt"><pre><u></u>=C2=A0<u></u></pre><pre><u></u>=C2=
=A0<u></u></pre><pre><u></u>=C2=A0<u></u></pre><pre>Ciao<u></u><u></u></pre=
><pre>Hannes<u></u><u></u></pre><pre><u></u>=C2=A0<u></u></pre><p class=3D"=
MsoNormal"><br><br><br><u></u><u></u></p><pre>_____________________________=
__________________<u></u><u></u></pre><pre>OAuth mailing list<u></u><u></u>=
</pre><pre><a href=3D"mailto:OAuth@ietf.org" target=3D"_blank">OAuth@ietf.o=
rg</a><u></u><u></u></pre><pre><a href=3D"https://www.ietf.org/mailman/list=
info/oauth" target=3D"_blank">https://www.ietf.org/mailman/listinfo/oauth</=
a><u></u><u></u></pre></blockquote><p class=3D"MsoNormal"><u></u>=C2=A0<u><=
/u></p></div></div>______________________________<u></u>_________________<b=
r>
OAuth mailing list<br>
<a href=3D"mailto:OAuth@ietf.org" target=3D"_blank">OAuth@ietf.org</a><br>
<a href=3D"https://www.ietf.org/mailman/listinfo/oauth" target=3D"_blank">h=
ttps://www.ietf.org/mailman/<u></u>listinfo/oauth</a><br>
</blockquote></div>

--001a11c3674273b3a205093f21d7--

