The "Basic" authentication scheme defined in RFC 2617 does not properly define how to treat non-ASCII characters. This has lead to a situation where user agent implementations disagree, and servers make different assumptions based on the locales they are running in. There is little interoperability for characters in the ISO-8859-1 character set, and even less interoperability for any characters beyond that.¶
This document defines a backwards-compatible extension to "Basic", specifying the server's character encoding expectation, using a new authentication scheme parameter.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as “work in progress”.¶
This Internet-Draft will expire on February 17, 2011.¶
Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.¶
Distribution of this document is unlimited. Although this is not a work item of the HTTPbis Working Group, comments should be sent to the Hypertext Transfer Protocol (HTTP) mailing list at email@example.com, which may be joined by sending a message with subject "subscribe" to firstname.lastname@example.org.¶
XML versions, latest edits and the issues list for this document are available from <http://greenbytes.de/tech/webdav/#draft-reschke-basicauth-enc>.¶
|I edit (type: edit, status: open)|
|email@example.com||2010-08-11||Umbrella issue for editorial fixes/enhancements.|
|Associated changes in this document: A.1, A.2, B.2, <#rfc.change.edit.4>.|
|I paramcase (type: change, status: closed)|
|firstname.lastname@example.org||2010-08-12||Are auth param names case-sensitive?|
|2010-08-12||Resolution: Be consistent with "realm" (case-insensitive). Note that should be clarified in RFC2617bis for auth params in general.|
|Associated changes in this document: 3, 3.|
|I credparam (type: change, status: closed)|
|email@example.com||2010-08-12||Should "encoding" also be defined for the credentials (the UA's response)?|
|Resolution: Disallow (but reserve) encoding in credentials, and explain why this is the case.|
|Associated changes in this document: 3, 3, 3, B.|
The "Basic" authentication scheme defined in Section 2 of [RFC2617] does not properly define how to treat non-ASCII characters ([USASCII]): it uses the Base64 [RFC4648] encoding of the concatenation of username, separator character, and password without stating which character encoding to use.¶
This has lead to a situation where user agent implementations disagree, and servers make different assumptions based on the locales they are running in. There is little interoperability for characters in the ISO-8859-1 character set ([ISO-8859-1]), and even less interoperability for any characters beyond that.¶
Servers MAY use the "encoding" authentication parameter↓ to express the character encoding they expect the user agent to use. ↑ [case-sens: Are parameter names case-sensitive?] ↑↓ [also-cred: Should this also work as a parameter on the credentials? See Appendix del-1.] ¶
Other values are reserved for future use.¶
In the example below, the server prompts for authentication in the "foo" realm, using Basic authentication, with a preference for the UTF-8 character encoding:
WWW-Authenticate: Basic realm="foo", encoding="UTF-8"
Note that the parameter value can be either a token or a quoted string; in this case the server chose to use the quoted-string notation.
The user's name is "test", and his password is the string "123" followed by the Unicode character U+00A3 (POUND SIGN). Following Section 1.2 of [RFC2617], but using the character encoding UTF-8, the user-pass, converted to a sequence of octets, is:¶
't' 'e' 's' 't' ':' '1' '2' '3' pound 74 65 73 74 3A 31 32 33 C2 A3
Thus the Authorization header field would be:¶
Authorization: Basic dGVzdDoxMjPCow==
There are no IANA Considerations related to this specification.¶
The internationalisation problem has been reported as a Mozilla bug back in the year 2000 (see <https://bugzilla.mozilla.org/show_bug.cgi?id=41489>). It was Andrew Clover's idea to address it using a new auth-param.¶
Thanks to Martin Thomson for providing feedback on this document.¶
User agents which already default to UTF-8 do not need to be changed at all. Other user agents can keep their default behavior, and switch to UTF-8 when seeing the new parameter.
On the other hand, the strategy below may already improve the user-visible behavior today:
Origin servers that expect ISO-8859-1 encoding do not require any changes. Other servers that already expect UTF-8 can add the new parameter without any risk of breaking existing user agents. [testme: We may want to confirm this with test cases.]
There are sites in use today that default to a locale encoding, such as ISO-8859-1, and expect user agents to use that encoding. These sites will break if the user agent uses a different encoding, such as UTF-8.¶
Defining a parameter on the credentials would make it easier for the server to find out what the client is sending. As far as clients only send the credentials parameter when the server opted-in through the challenge, there should be no interop issue.
This sounds like a nice-to-have, but doesn't seem to be really needed. Feedback appreciated.