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 <e...@hueniverse.com> 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=...&state=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
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>
_______________________________________________
OAuth mailing list
OAuth@ietf.org
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to