If the server issues clients with password credentials it MUST support HTTP Basic (this is the flip side of 'the client MAY use HTTP Basic') and should only support the client_secret parameter if it has clients incapable of using HTTP Basic.
This language has been tweaked to reach a delicate balance. I'm not inclined to touch it. EHL > -----Original Message----- > From: oauth-boun...@ietf.org [mailto:oauth-boun...@ietf.org] On Behalf > Of André DeMarre > Sent: Wednesday, September 14, 2011 5:25 PM > To: OAuth WG > Subject: Re: [OAUTH-WG] Fwd: secdir review of draft-ietf-oauth-v2 > > I agree that stating "Clients in possession of a client password MAY use the > HTTP Basic authentication scheme" [Section 2.3.1 paragraph 1] implies that > authorization servers MUST support HTTP basic authentication, but such is > never asserted. Instead, it says "The authorization server MAY accept any > form of client authentication meeting its security requirements." [Section 2.3 > paragraph 1] This is somewhat contradictory. > > I can understand that requiring a specific method of client authentication is > desirable for maximum interoperability, but this would be problematic for > authorization server implementations that wish to enforce stronger security > than HTTP Basic. Such implementations would be forced to deviate from the > specification. In particular, implementations which choose MAC access > tokens instead of Bearer tokens may wish to add a layer of security to > defend against improperly configured TLS connections, or to protect clients > who connect to the wrong server. > [http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/] > Such implementations will also find HTTP Basic undesirable for client > authentication. To require a form of client authentication that isn't > universally > sufficient could become a source of criticism and deter adoption of OAuth > 2.0. > > I think the best solution is to clarify section 2.3.1 as follows: > --- > Clients in possession of client credentials MAY use any form of authentication > scheme supported by the authorization server. > --- > And then follow with the existing example that demonstrates HTTP Basic. > > Regards, > Andre DeMarre > > On Tue, Sep 13, 2011 at 4:52 PM, Greg Brail <g...@apigee.com> wrote: > > I would like to add my support to the comments below on section 2.3, > > specifically 2.3.1. > > > > It is clear to me from reading section 2.3 that clients MAY use HTTP > > basic, or they MAY include client_id and client_secret in the request > > body -- however, the latter is not recommended. > > > > It is not clear what the authorization server MUST support. IMHO, that > > leads us to a situation in which there is no universally-agreed set of > > authentication technology that all programmers can assume is going to > > work, which means that interoperability will be difficult as some > > authorization servers will support Basic, others will support the > > request body, and others will do neither in favor of something else. > > > > I would prefer that we make both HTTP basic AND the request body > > mechanisms in this section both required on the server side, thus > > giving the client the option of choosing one or the other. That would > > mean re-writing the beginning of section 2.3.1 as shown below. > > > > If I have missed other discussion on this topic I apologize. If there > > is already consensus to make the "message body" authentication > > optional rather than required for the authorization SERVER then I > > would still recommend that we make HTTP Basic a MUST in order to allow > > easier interop. > > > > Proposed change to 2.3.1: > > > > ---- > > > > The authorization server MUST support the HTTP Basic authentication > > scheme as defined in [RFC2617] as a way to identify clients. The > > client identifier is used as the username, and the client password is > > used as the password. > > > > For example (extra line breaks are for display purposes only): > > > > Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW > > > > Alternatively, the authorization server MUST also allow the client to > > include the client credentials in the request body using the following > > parameters: > > > > client_id > > REQUIRED. The client identifier issued to the client during > > the registration process described by Section 2.2. > > client_secret > > REQUIRED. The client secret. The client MAY omit the > > parameter if the client secret is an empty string. > > > > Clients in possession of a client password MAY use either mechanism in > > order to authenticate with the authorization server. However, > > including the client credentials in the request body using the two > > parameters is NOT RECOMMENDED, and should be limited to clients unable > > to directly utilize the HTTP Basic authentication scheme (or other > > password-based HTTP authentication schemes). > > > > (Rest of section remains as-is with the paragraph beginning "For > > example...") > > > > Gregory Brail | Technology | Apigee | +1-650-937-9302 > > > > On Mon, Sep 12, 2011 at 2:02 PM, Stephen Farrell > > <stephen.farr...@cs.tcd.ie> wrote: > >> > >> FYI, probably best for the WG to see/process these secdir comments as > >> appropriate. I've not read 'em in detail myself yet, so as Leif says, > >> feel free to react as appropriate. > >> > >> S. > >> > >> PS: Thanks Leif for reviewing this. > >> > >> -------- Original Message -------- > >> Subject: secdir review of draft-ietf-oauth-v2 > >> Date: Mon, 12 Sep 2011 20:31:06 +0200 > >> From: Leif Johansson <le...@sunet.se> > >> To: draft-ietf-oauth...@tools.ietf.org, sec...@ietf.org, > >> i...@ietf.org > >> > >> -----BEGIN PGP SIGNED MESSAGE----- > >> Hash: SHA1 > >> > >> > >> Security review of OAUTH 2.0 core: draft-ietf-oauth-v2-21 > >> > >> Do not be alarmed. I have reviewed this document as part of the > >> security directorate's ongoing effort to review all IETF documents > >> being processed by the IESG. These comments were written primarily > >> for the benefit of the security area directors. Document editors and > >> WG chairs should treat these comments just like any other last call > >> comments. > >> > >> This review is rather lengthy. This should not be interpreted as > >> anything beyond a desire to do a thorough review. > >> > >> It may well be that I have stumbled on things already covered on the > >> list. If so I apologize and ask that you silently ignore such bits. > >> Also I have included things that are not directly security related > >> but that I found problematic for other reasons. > >> > >> The notes are presented in the order I wrote them down. > >> > >> ** General observations: > >> > >> POST and/or GET > >> > >> Examples are sometimes POST and sometimes GET. In many cases it is > >> not clear to me from the surrounding text if both POST and GET are > >> allowed or if only one is mandated. Illustrating with both a GET > >> _and_ POST example in the cases where both are supported would help > >> or make the method explicit in the text before the example. > >> > >> The P-word > >> > >> The term 'password' is sprinkled throughout the document, sometimes > >> as in "client password" or "resource owner password credentials" and > >> I suspect that sometimes it is password as in 'an example of a > >> credential type' and in other cases it is password as in 'plain old > >> password'. This needs to be cleared up throughout (I've included some > >> examples below). > >> > >> Normative Language > >> > >> I've often found myself wanting more normative language often to > >> replace existing but less precise text. I've called out some > >> important cases below. > >> > >> Unknown parameters > >> > >> The sentence "The client SHOULD ignore unrecognized response > parameters" > >> occurs in several places. First of all I would argue that this has to > >> be a MUST if you want to be able to guarantee extensibility. Secondly > >> there are some error responses that are triggered by unsupported > >> request parameters. This seems like an inconsistency. > >> > >> ** Specifics > >> > >> 1.1 Roles > >> > >> Forward references to the sections where the roles are defined would > >> improve readability. > >> > >> As an illustration of an alternative model for the authorization > >> server maybe an informative reference to UMA would be illustrative > here. > >> > >> 1.2 Protocol Flow > >> > >> (A) talks about 'an intermediary such as an authorization server.' it > >> isn't clear it me if this refers to a separate authorization server > >> or if it is the same authorization server that is referenced in (B). > >> > >> 1.3.3 Resource Owner Password Credentials > >> > >> When I first read this I thought - why not talk about Resource Owner > >> Credentials - in fact there is a parenthesis there "(e.g a username > >> and password)" that seems to indicate that other credentials could be > >> supported. > >> > >> This needs to be cleared up. Either its username and password and > >> nothing else or there is a way to support things like Negotiate or > >> X.509-based credentials in which case it should really be Resource > >> Owner Credentials with no reference to passwords other than as as an > >> example of one possible credential type. > >> > >> 1.4 Access Token > >> > >> first paragraph: "The string is usually opaque". This should be > >> reformulated as normative language. In fact I would have liked > >> guidance on generating those tokens (which has been brought up on the > >> list) possibly as part of an implementation-guide. > >> > >> 1.5 Refresh Token > >> > >> Why is the refresh token not simply treated as an access token for > >> the access token resource in the authorization server? This would > >> seem to simplify the model a bit by removing a type of token whose > >> semantic (at least to this reviewer) is a duplication of a normal > >> access token for a particular type of resource. > >> > >> Also in the first paragraph: "(access tokens may have a shorter > >> lifetime and fewer permissions". Why not try to write normative > >> language here - there are security implications of allowing a refresh > >> token to get more permissions (say) than the original access token. > >> > >> 2.1 Client types > >> > >> I find the terminology public/confidential somewhat counter-intuitive. > >> An app you have on your personal device is 'public' while a shared > >> cloud service is 'confidential'...hmm... > >> > >> This section also lacks normative language which isn't good. There > >> should be language defining the behavior of public and confidential > >> client aswell as the three profiles. > >> > >> For instance under native application we have "It is assumed that any > >> client authentication credentials included in the application can be > >> extracted". This should really be normative language. Some of what I > >> am looking for can be found in section 2.3 but it isn't clear to me > >> that it covers the definition of the profiles. > >> > >> 2.3.1 Client Password > >> > >> There is also some confusion here about what the client must > >> implement and what the server must implement wrt the use of > >> client_id. I read the text as trying to say that Servers SHOULD > >> support both and clients SHOULD only do Basic. > >> > >> This section also seems to have been the product of a partial > >> s/password/credential/g operation. Either OAUTH is only meant to use > >> Basic and passwords or we want to cover all/most HTTP authentication > >> methods and credentials and then section 2.3.2 (which feels like an > >> afterthought) needs to get folded into 2.3.1 and the normative > >> language (and examples!) need some work to cover at least X.509s and > >> perhaps even Negotiate. > >> > >> Personally I would try to fold 2.3.1 and 2.3.2 into one section and > >> say that servers MUST support Basic and client_id+client_password. > >> Servers MAY support any HTTP authentication method with a mapping to > client_id. > >> If a client supports username+passwords it SHOULD do Basic and if it > >> supports other HTTP authentication methods it MUST NOT use > >> client_password for anything and MUST follow normal HTTP > >> authentication method negotiation. > >> > >> Finally, everywhere there is negotiation there must imho be some > >> mention/discussion/protection of downgrade attacks. > >> > >> 3.1 Authorization Endpoints > >> > >> 6th paragraph: "The authorization server SHOULD ignore unrecognized > >> request parameters". This formulation returns in several places in > >> the document and I don't understand why it isn't a MUST - after all > >> doesn't extensibility depend on this? > >> > >> 3.1.1 Response Type > >> > >> The response_type parameter is REQURED but its absence SHOULD result > >> in an error. Why not MUST? > >> > >> 3.1.2 Redirection Endpoint > >> > >> There should be a clear normative specification for how to match > >> endpoints. There are traces of this in various parts of the document > >> when matching is discussed. I recommend making a concise definition > >> in one place (namely here) and referencing this throughout. Since > >> this comparison has security implications it should be a priority for > >> the specification to be air-tight. > >> > >> 3.1.2.2 Registration Requirements > >> > >> "(the client MAY use the state request parameter to achieve > >> per-request customization)". Doesn't this overload its use for CSRF- > protection? > >> > >> 3.1.2.4 Invalid Endpoint > >> > >> "The authorization server SHOULD NOT redirect...". Why isn't this a > >> MUST NOT? > >> > >> 3.1.2.5 Endpoint Content > >> > >> This section basically seems to say "Serve with server-side code not > >> with html or client-side code". If this is the case then I suggest > >> reformulate to say precisely that using normative language. > >> > >> The use of the word "script" could perhaps also be made less > >> ambiguous since in this case it could refer to both server-side code > >> aswell as in-browser code. > >> > >> 3.2.1 Client Authentication > >> > >> The phrase "clients issued client credentials" could be rephrased to > >> make less violence on English - perhaps "clients that have been > >> issued with client credentials", unless that is not the intended > >> meaning in which case I argue for something easier to understand ;-) > >> > >> The second bullet: Using client credentials more often also exposes > >> them more which might be worth mentioning aswell. > >> > >> 4. Obtaining Authorization > >> > >> Perhaps not critical but the term 'password credentials' occurs in > >> the first paragraph and this doesn't seem compatible with resource > >> owner authentication being out of scope. It could just be that it > >> should read 'resource owner credentials' but it could also signal an > >> underlying assumption about username and password being used for > >> resource owner authentication. In either case I thing its best to > >> avoid the use of the word 'password' to avoid any confusion. > >> > >> 4.1 Authorization Code > >> > >> (C) - "using the redirection URI provided earlier" should perhaps > >> read "using the redirection URI provided earlier or associated with > >> the client in client registration" > >> > >> > >> 4.1.1 and 4.1.2 Authorization Request/Authorization Response > >> > >> The redirect_uri is listed as OPTIONAL with a reference to 3.1.2 but > >> there is no mention in 4.1.2 how to handle the case when the > >> redirect_uri is not present. I believe the assumption is that the > >> redirect_uri is either resent or part of client registration but that > >> needs to be made explicit in that case. > >> > >> This may apply to other uses of the redirect_uri parameter eg in 4.2.1. > >> > >> Furthermore in 4.2.2 "code" I suggest the following re-formulatation > >> of the last sentence: "The client MUST NOT use an authorization code > >> for more than one request. If an authorization code is re-used, the > >> authorization server should treat that as a replay attack and SHOULD > >> revoke all tokens associated with the client." (i.e loose the "attempt" > >> bit which carries no real meaning) > >> > >> Also note that this is potentially a DOS attack should a single authz > >> code leak. > >> > >> 4.1.2.1 Error Response > >> > >> First paragraph, last sentence "and MUST NOT automatically redirect". > >> In the light of how willing users normally are to click on links > >> presented to them I would strengthen this to "MUST prevent the user > >> from following the redirect URI" > >> > >> In the definition of the invalid_request parameter I don't understand > >> how unsupported parameters can generate an error since endpoints > >> should ignore unsupported parameters (in order to support extensibility). > >> > >> 4.1.3 Access Token Request > >> > >> "require client authentication for confidential clients or for any > >> client issued client credentials (or with other authentication > >> requirements)" > >> > >> This text seems unnecessarily convoluted. Isn't enough to say that if > >> you have issued credentials to a client you MUST require > >> authentication from that client? This applies equally to the other > >> sections where client authentication is an issue (eg 4.3.2). > >> > >> Also cf my comment on 3.1.2 for the discussion of matching > >> redirect_uri in the last bullet: ".. and that their values are > >> identical". Is this really meant to mean identical? > >> > >> 4.2 Implicit Grant > >> > >> The parenthesis "(it does not support the issuance of refresh tokens)" > >> sounds like it should really be normative language, "refresh tokens > >> MUST NOT be issues for implicit grant" because afaiu you could easily > >> extend "fragment-transport" to include a refresh-token, so it isn't a > >> technically motivated constraint, right? > >> > >> In (D) I would like to have a normative reference to a document that > >> specifies browser behavior for URL fragments since this is a critical > >> security dependency for this grant type. > >> > >> 4.4 Client Credentials > >> > >> I think the text should note that this model effectively implies that > >> the client is able to impersonate all users which has the potential > >> for worse security problems than if the client has access to > >> individual user passwords. > >> > >> 6 Refreshing an Access Token > >> > >> scope - The term "lesser than" is intuitive but imprecise. I suggest > >> "MUST NOT include any scope not originally granted by the resource > owner". > >> > >> 7.1 and 8.1 Access Token Types > >> > >> The section 7.1 lists two definitions of access token types and > >> provides a couple of examples but doesn't provide any constraints on > >> future development of access tokens except in 8.1 where it is implied > >> that not all access token types would be associated with HTTP > >> authentication mechanisms. Are there really no constraints on access > >> token types that should be captured? > >> > >> 10.6 Authorization Code Redirection URI Manipulation > >> > >> Suggest replace the word 'familiar' with 'trusted' in the first > >> sentence of the second paragraph. The notion of trust opens up > >> several boat loads of worm but it is the correct term here I think. > >> > >> In the third paragraph "the same as" wrt redirection URIs occur and > >> this needs to be defined (cf comments on 3.1.2 above). > >> > >> Finally "The authorization server MUST require public clients and > >> SHOULD require confidential clients to register their redirection > >> URI". I am missing a discussion of why the two types of client differ > >> wrt this attack vector. > >> > >> 10.10 Credentials Guessing Attack > >> > >> I found myself wanting implementation advice for how to generate good > >> tokens at this point. This has been raised on the list too. The same > >> goes for how to generate good CSRF cookies where the "(eg a hash of > >> the session cookie..." feels like it is implementation advice > >> yearning to come out of the closet. > >> > >> > >> Thats it. > >> > >> Cheers Leif > >> -----BEGIN PGP SIGNATURE----- > >> Version: GnuPG v1.4.11 (GNU/Linux) > >> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ > >> > >> > iEYEARECAAYFAk5uT+YACgkQ8Jx8FtbMZncXQgCfZmTlzuESq0plfpkceQN1ont > E > >> a1QAoIEcg06GYK+6Fn4y40cTL1jQ+KmS > >> =ox42 > >> -----END PGP SIGNATURE----- > >> > >> _______________________________________________ > >> 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 > > > _______________________________________________ > 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