OK, nevermind, I think I wasn't reading things correctly. I've re-read
both the current spec and the proposal below and I think I've answered
my own question. My question was essentially "how does the Javascript
client get the authorization code back to the server?", but now I see
that it doesn't have to. The callback URL has all the bits that it would
need in order to do that since, just as in the web-server flow, the
callback URL is on the web-server making the authorization request in
the first place. This wouldn't be an option for user-agent clients with
a provider-hosted callback URL, obviously.

 -- Justin

On Thu, 2010-06-17 at 14:09 -0400, Eran Hammer-Lahav wrote:
> What do you mean by valid data?
> 
> In the user-agent case, the server returns an access token. We added an 
> optional authorization code which can only be used after exchanging it for an 
> access token with required client authentication (client secret).
> 
> EHL
> 
> -----Original Message-----
> From: Justin Richer [mailto:[email protected]] 
> Sent: Thursday, June 17, 2010 11:05 AM
> To: Marius Scurtescu
> Cc: Eran Hammer-Lahav; OAuth WG ([email protected])
> Subject: Re: [OAUTH-WG] Proposal: simplification of the end-user 
> authorization endpoint
> 
> I think I'm missing something on the combined case here. How does the server 
> trust the javascript client code to pass it back valid data? Is it assumed to 
> just rely on an established browser session at that point that the javascript 
> client has access to?
> 
>  -- Justin
> 
> On Thu, 2010-06-17 at 13:48 -0400, Marius Scurtescu wrote:
> > Shifting from client type profile names to flow type profiles sounds good.
> > 
> > Not too sure about the combined case, token_and_code. I am not opposed 
> > to it, but I think it would help us wrap our heads around it if a 
> > detailed use case was presented.
> > 
> > Thanks,
> > Marius
> > 
> > 
> > 
> > On Wed, Jun 16, 2010 at 11:05 PM, Eran Hammer-Lahav <[email protected]> 
> > wrote:
> > > This is a joint proposal from David Recordon and me:
> > >
> > > ** Background:
> > >
> > > The latest draft (-08) unified the  web-server and user-agent client 
> > > types into a single authorization request format. This was done because 
> > > once we added an optional authorization code to the user-agent response, 
> > > it became almost identical to the web-server call. The two remaining 
> > > differences:
> > >
> > > - The web-server response must not return an access token, only an 
> > > authorization code.
> > > - The web-server response uses the URI query while the user-agent 
> > > response uses the URI fragment.
> > >
> > > The way in which the client indicates which response is requests is by 
> > > using the 'type' parameter with either 'web_server' or 'user-agent'. This 
> > > is all documented in:
> > >
> > > http://tools.ietf.org/html/draft-ietf-oauth-v2-08#section-3
> > >
> > > Many (if not most) services are likely to implement both the user-agent 
> > > and web-server types (based on existing deployment and the requirements 
> > > expressed by many of the participants).
> > >
> > > The web-server flow requires client authentication (client secret) in 
> > > order to obtain an access token. It also enables the registration of a 
> > > redirection URI.
> > >
> > > When using the user-agent flow, the client does not authenticate with the 
> > > authorization server (at all) to obtain an access token. However, it does 
> > > need to authenticate if it wants to exchange the optional authorization 
> > > code for (another) access token.
> > >
> > > The authorization server has a few options when managing the security and 
> > > trust implications of each request type:
> > >
> > > - Require that the client provide its type when registering with the 
> > > service - if the authorization server knows the client type, it can limit 
> > > that client to only make requests suitable for that client type, as well 
> > > as only issue a client secret when the client is not a user-agent.
> > >
> > > - Issue different access tokens based on the security context in which 
> > > they are obtained - access tokens issued using the direct user-agent 
> > > request will provide less access (shorter duration, read only, etc.) than 
> > > an access token obtained using the web-server request type.
> > >
> > > The first approach is problematic for complex clients requesting both an 
> > > access token and authorization code using the user-agent request type. In 
> > > this case, the authorization server is issuing two access tokens, each 
> > > using a different level of security. It is means that one developer will 
> > > need to obtain a different client identifier for the same application 
> > > across different platforms.
> > >
> > > The current separation between the two request types (user-agent and 
> > > web-server) seems artificial. This is especially true when considering 
> > > the use cases for native applications and the applicability of both 
> > > options. At the end, the client type doesn't matter. What matters is 
> > > whether the access token is issued with or without client authentication 
> > > (and whether that authentication can be trusted, which goes beyond what 
> > > the protocol can provide).
> > >
> > > ** Proposal:
> > >
> > > Replace the 'type' parameter with a new parameter called 'request' 
> > > (working title) which can take one of three values: 'token', 'code', or 
> > > 'token_and_code'. This will allow the client (regardless of its type) to 
> > > explicitly say what it wants.
> > >
> > > The response is sent as follows:
> > >
> > > - If the client requests an access token, all the response parameters 
> > > (including errors) are included in the fragment (same as the user-agent 
> > > flow today).
> > > - If the client requests an authorization code, all the parameters are 
> > > included in the query (same as the web server flow today).
> > > - If the client requests both, the 'code', 'status', and 'error' are 
> > > included in the query while everything else is included in the fragment 
> > > (explained in the example below).
> > >
> > > The authorization server issues the appropriate user warnings and access 
> > > token based on the authentication level obtained. For example, when 
> > > issuing an access token the server has to consider:
> > >
> > > - Was the client authenticated using a secret or other means?
> > > - Was the redirection URI registered?
> > > - Is this a known client (white list) from a trusted third party (they 
> > > are known not to leak their secrets)?
> > >
> > >  The advantage of this approach is that it more clearly frames the 
> > > security context of issuing tokens. It puts native applications at the 
> > > same level as the web-server and user-agent clients (no one gets a 
> > > special parameter value).
> > >
> > > ** Examples:
> > >
> > > To help show the similarities, here are three example requests and 
> > > responses:
> > >
> > > - Token only (aka user-agent):
> > >
> > >   https://server.example.com/oauth/authorize?
> > >     client_id=...&
> > >     redirect_uri=http://client.example.com/callback&;
> > >     request=token&
> > >     state=foo
> > >
> > >   
> > > http://client.example.com/callback#access_token=...&expires_in=...&s
> > > tate=foo
> > >
> > > In this case all of the parameters are in relation to the token and thus 
> > > consumed directly by the JavaScript, desktop app, etc.
> > >
> > > - Code only (aka web-server):
> > >
> > >   https://server.example.com/oauth/authorize?
> > >     client_id=...&
> > >     redirect_uri=http://client.example.com/callback&;
> > >     request=code&
> > >     state=foo
> > >
> > >   http://client.example.com/callback.php?code=...&state=foo
> > >
> > > In this case there isn't an access token and all of the parameters are 
> > > consumed by the client's server to be traded for an access token via a 
> > > HTTPS request to the AS.
> > >
> > > - Token and code:
> > >
> > > https://server.example.com/oauth/authorize?
> > >   client_id=...&
> > >   redirect_uri=http://client.example.com/callback&;
> > >   request=token_and_code&
> > >   state=foo
> > >
> > > http://client.example.com/callback.php?code=...&state=foo#access_token=...&expires_in=...
> > >
> > > In this case the parameters are consumer both by the JavaScript and the 
> > > client's server. The parameters about the access token are in the 
> > > fragment. The code is a query parameter so that the server can access it. 
> > > state and error are useful to both and thus are query parameters which 
> > > can be accessed by the JavaScript and the server.
> > >
> > >
> > > _______________________________________________
> > > OAuth mailing list
> > > [email protected]
> > > https://www.ietf.org/mailman/listinfo/oauth
> > >
> > _______________________________________________
> > OAuth mailing list
> > [email protected]
> > https://www.ietf.org/mailman/listinfo/oauth
> 
> 


_______________________________________________
OAuth mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to