- From: John Panzer <jpanzer@acm.org>
- Date: Thu, 14 Feb 2008 10:49:34 -0800
- To: Ian Hickson <ian@hixie.ch>
- CC: "WAF WG (public)" <public-appformats@w3.org>
- Message-ID: <47B48D3E.3090506@acm.org>
Ian Hickson wrote:
> On Wed, 13 Feb 2008, John Panzer wrote:
>
>> An API needs to do an authorization check on a CSR request, not an
>> authentication check. For CSR especially, just doing an authn check
>> doesn't give you valid evidence of authorization.
>>
>
> Agreed.
>
>
>
>> Some of today's APIs like Flickr put authorization evidence into URL
>> query parameters for CSR. It's mildly bad to do this because such
>> things are more likely to get logged and sniffed than headers, and you
>> can't separate the resource URL from the authorization proof being
>> presented to use it, which would be useful in caching.
>>
>
> Also agreed. That's one of the reasons that XMLHttpRequest + Access
> Control together let you set arbitrary extension headers.
>
>
>
>> The OAuth spec uses
>>
>> Authorization: OAuth ...
>>
>> by preference for these reasons, where the ... represents an
>> authorization proof provided by the party A script. It looks like this
>> is disallowed by the AC4CSR specification.
>>
>
> Right, you'd have to use X-OAuth or something like that. "Authorization"
> headers are reserved for user and client authentication [sic], as
> described in HTTP 1.1 section 14.8.
>
>
Relevant text, just for reference:
14.8 Authorization
A user agent that wishes to authenticate itself with a server--
usually, but not necessarily, after receiving a 401 response--does
so by including an Authorization request-header field with the
request. The Authorization field value consists of credentials
containing the authentication information of the user agent for
the realm of the resource being requested.
Authorization = "Authorization" ":" credential
>
>> 1. Should OAuth invent a new header for authorization? That is, should
>> we not be using Authorization: for authorization?
>>
>
> When it's direct A-B communication, and A is authenticating to B, then
> Authorization: is appropriate. When there are three parties, and the
> communication is from C to B on behalf of A, the Authorization: header is
> authenticating C, not A. A needs to use different headers in this case.
>
I'm not sure I understand the distinction being made here, possibly
because OAuth doesn't really follow this model? Let me try to work this
out...
Take the delegated server case first. I, the user, talk to server B and
tell it that it's okay for server C to do certain operations on my
behalf (read my address book for example). I believe I'm A in this
case. So later on, C can talk to B on my (A's) behalf in order to
retrieve my address book data. In the case of OAuth, there are actually
two components to this:
1. C proves that it's C to B (typically by signing with a long-lived
shared secret)
2. C asserts that it has permission from A to do the operation (by
signing with a second, shorter lived shared secret generated when A
granted permission)
However, (1) and (2) aren't physically separated -- the secrets are
combined and both are used to sign the request. There is no separate
authentication/authorization step, just a single auth[nz] step. So it
appears that we're authenticating C in this case (and also authorizing
the specific request).
Now in the case of CSR, I'll assert that C is a distributed system
consisting of a server component plus Javascript extensions that run on
my desktop in a sandbox. From my P.O.V. as a user, I'm still dealing
with C. I talk to B and tell it it's okay for C to read my address
book; C's Javascript then executes (1) and (2) and makes the CSR call to
B. Is the situation different than in the delegated server case?
Aside #1: The security is definitely different if we leak secrets to end
user machines, but there are ways to deal with that that don't affect
this discussion I think.
Aside #2: To make things more complicated, in some cases you can skip
(2); for operations that don't require user permissions, for example, or
where the user permissions are asserted some other way. In this case
you have the same mechanism but simply use an empty string for step 2,
so effectively you are only proving that you're C.
Aside #3: To make things even more complicated, OAuth also allows for
semi-trusted assertions for #1, for example if you have a desktop
application where the 'secret' ends up stored on an end user's
computer. You have to assume that this secret can be found and copied.
This is also similar to the case where you download Javascript to an end
user's computer and perform signing there, so it's probably the relevant
case for CSR. However, it would be possible to generate a unique secret
per end user computer too, so you can still do both #1 and #2 together
even with CSR.
Aside #4: Both Google AuthSub and Amazon's auth use Authorization: for
this purpose :).
-John
Received on Thursday, 14 February 2008 18:46:06 UTC