I have put together some comments/suggestions regarding the current draft.

3.2.1.  Response Format

The authorization server MUST include the HTTP "Cache-Control"
   response header field with a value of "no-store" in any response
   containing tokens, secrets, or other sensitive information.

Would'nt it make sense to require "no-cache", too?

3.2.1.1.  Access Token Response
   expires_in
         OPTIONAL.  The duration in seconds of the access token
         lifetime.

   refresh_token
         OPTIONAL.  The refresh token used to obtain new access tokens
         using the same end-user access grant as described in Section 6.


What is the exact meaning/idea of OPTIONAL response parameters?
Who actually decides to use them? The client or the authorization server or both? Is it optional to implement this feature or is it envisioned the server dynamically decides to use those parameters based on its policy?

expires_in

Why is there information passed back about the access tokens duration but not about the refresh tokens duration?

3.2.1.2.  Error Response

 If the token request is invalid or unauthorized, the authorization
   server constructs a JSON-formatted response which includes the common
   parameters set as well as additional flow-specific parameters.  The
   formatted parameters are sent to the client in the entity body of the
   HTTP response with a 400 status code (Bad Request).

To use status code 400 for all kinds of errors is very generic from my point of view. How shall the client implement a dedicated error handling if it cannot distinguish different errors. I would suggest either to define error codes (not only messages) in the spec or to use appropriate HTTP status codes for different error conditions, e.g. 401 for unauthorized calls.

3.4.  Client Credentials

The client credentials include a client identifier and
   an OPTIONAL symmetric shared secret.

What is meant by "symmetric shared secret"? I'm familiar with the term "symmetric" in the context of cryptographical algorithms only. I think "shared secret" is sufficient.

3.5.  User-Agent Flow

These clients
   cannot keep client secrets confidential and the authentication of the
   client is based on the user-agent's same-origin policy.

Does this still hold in the context of "HTTP Origin Headers" (http://www.petefreitag.com/item/702.cfm)?

BTW: Will Brian's security considerations document be updated to be in sync with the draft?

3.5.1.  Client Requests Authorization

If the client has previously registered a redirection URI with the
   authorization server, the authorization server MUST verify that the
   redirection URI received matches the registered URI associated with
   the client identifier.

Does this mean equality? Or just the same base string?

3.5.1.1.  End-user Grants Authorization

I would suggest to use JSON encoding here, since the URI fragment is handled by a client more or less like a response result.

3.6.1.1.  End-user Grants Authorization

Why not call the "code" Parameter "verification_code"? It's called verification code in the text.

3.6.2.  Client Requests Access Token

client_secret
         REQUIRED if the client identifier has a matching secret.  The
         client secret as described in Section 3.4.

1) I'm having trouble to understand the meaning of "if the client identifier has a matching secret". Is the assumption underneath that authorization servers require this secrets from all clients they have issued a secret to? What about client w/o a secret? Are they also allowed to use this flow? Or is there envisioned a dependency between the client type, clients credentials and the flows a particular client is authorized to use?

I would have expected a clear policy which flows require authentication and which not.

2) I would suggest to replace the request parameter by an Authorization header. First of all because that's the way credential transmission is handled in HTTP. Moreover, it better fits with error handling. If the secret is missing or wrong, the authorization server can answer with status code 401 and a WWW-Authenticate header(s) specifiying mechanism and realms to be used by the client in order to authenticate to the server.

In the long run it gives deployments more freedom to use other mechanisms than sending shared secrets as plain text over the wire.

    HTTP/1.1 400 Bad Request
     Content-Type: application/json
     Cache-Control: no-store

     {"error"="incorrect_client_credentials"}

From my point of view, "redirect_uri_mismatch" and "bad_verification_code" call for status code 403, whereas "incorrect_client_credentials" is the 401 candidate.

3.7.1.  Client Requests Authorization
     HTTP/1.1 200 OK
     Content-Type: application/json
     Cache-Control: no-store

     {"code":"74tq5miHKB","user_code":"94248","user_uri":"http%3A%2F%2
     Fwww%2Eexample%2Ecom%2Fdevice","interval"=5}

Why is the user_uri URL-encoded?

3.7.2.  Client Requests Access Token

"authorization_declined"

Why does the spec interpret a request as bad request if the user just has declined the authorization? According to rfc2616 the semantics of 400 is: "The request could not be understood by the server due to malformed syntax".

The calling client did not sent a malformed request, it cannot foresee or influence this outcome. I would suggest to either use status 403 or to return status code 200 for all syntactically correct and authorized request and to use another return codes in the response body to detail the requests outcome.

4.  Username and Password Flow
4.1.  Client Requests Access Token

As statet in this section's introduction, this flow is intended to migrate existing clients from BASIC/DIGEST to OAuth. I therefore would suggest to use excactly these HTTP authentication schemes to transfer user credentials. This would mean to remove the parameters "username" and "password" and to use Authorization headers instead. At Deutsche Telekom, we have to deal with that class of clients. Such clients have already implemented their credential handling including header manipulation. The proposed change would further simplify their migration.

6.  Assertion Flow

This flow is suitable when the client is acting autonomously or on behalf of
   the end-user (based on the content of the assertion used).

Let's assume the assertion attests an end-user's identity. How shall the authorization server determine the clients identity in this case? I would suggest to add optional client_id/client_secret parameters (or an Authorization header) for that case.

7.  Refreshing an Access Token

I would suggest to add an optional "scope" parameter to this request. This could be used to downgrade the scope associated with a token.

8.1.  The Authorization Request Header

I consider the name "Token" of the authentication schema much to generic. That was also the feedback of all colleagues I talked to about the upcoming standard. Why not call it "OAuth2"?

8.2.2.  Form-Encoded Body Parameter

I would suggest to drop this section/feature.

General note: Would it make sense to add explicit format handling to the OAuth API? If we envision authorization servers supporting more than one token format (e.g. SAML, SWT, ...), the client should given the option to request a certain format and responses returning access tokens should indicate the format of this token. The OAuth authorization header could also have an optional format attribute for the same purpose.

regards,
Torsten.


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

Reply via email to