> 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.
Very well. Without changing the meaning, I think the community would be well served by appending paragraph 2 of Section 2.3 as follows: ---- Confidential clients are typically issued (or establish) a set of client credentials used for authenticating with the authorization server (e.g. password, public/private key pair). If clients are issued passwords, the authorization server MUST support the HTTP Basic authentication scheme as defined in [RFC2617] and described by Section 2.3.1. ---- This helps to communicate that authorization servers are only required to support HTTP Basic if they issue client passwords. Andre On Tue, Sep 20, 2011 at 3:20 PM, Eran Hammer-Lahav <e...@hueniverse.com> wrote: > 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