Leaving the naming aside (the hardest part of any software), I am generally positive about your idea. A protocol version bump may be avoidable like you suggested. Perhaps a prototype of this idea is in order to help shape the idea? Would you like to take it on?
> On May 21, 2023, at 4:21 AM, Derek Chen-Becker <de...@chen-becker.org> wrote: > > We had a recent discussion in Slack about how to potentially use the OPTIONS > and SUPPORTED messages in the existing CQL protocol to allow the server to > advertise more than one authentication method and allow the client to then > choose which authenticator to use. The primary use case here is to allow > seamless migration to a new authenticator without having to have all parties > involved agree on a single class (and avoid a disruptive change). There's > already a ticket open that was focused on making a change to the binary > protocol (https://issues.apache.org/jira/browse/CASSANDRA-11471) but I think > that we can accomplish this in a backwards compatible way that avoids a > change to the protocol itself. > > What I propose is to allow a server configured for this graceful auth change > to send an additional value in the [string multimap] body of the SUPPORTED > message that indicates which authenticators are supported, in descending > priority order. For example, if I wanted to migrate my server to support both > PlainTextAuthProvider and some new MyAwesomeAuthProvider, I would configure > my client to query options and the server would respond with > > 'AUTHENTICATORS': ['MyAwesomeAuthProvider', 'PlainTextAuthProvider'] > > The client can then choose from its own supported providers and send it as > part of the STARTUP message [string map] body: > > 'AUTHENTICATOR': 'MyAwesomeAuthenticator' > > I'm not good with naming so feel free to propose a different key for either > of these map entries. In any case, the server then validates that the > client-chosen authenticator is actually supported and would then proceed with > the AUTHENTICATE message. In the case where the client sends an > invalid/unsupported authenticator choice, the server can simply respond with > an AUTHENTICATE using the most-preferred configured authenticator. > > I think this is a better approach than changing the binary protocol because > the mechanism already exists for negotiating options and this seems like a > natural use case that avoids having to create an entirely new version of the > protocol. It does not appear to conflict with the existing protocol > definition but I'm not 100% certain. Section 4.1.1 discusses "Possible > options" for the STARTUP message > (https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v4.spec#L296), > but that's an unfortunate use of English that's ambiguous as to whether it > means "The only ones supported" or "Supported but not exclusively". > > I've taken a look at the Java and Python driver source so far and I can't > find anything that would seem to cause a problem by returning a SUPPORTED > multimap entry that the client isn't aware of (in both they would appear to > ignore it), but I'll also admit that this is the first time I've looked at > this part of the client code and I could be missing something. Is anyone > aware of possible problems that would be caused by using this approach? In > particular, if there are clients that strictly validate all entries in the > SUPPORTED map then this could cause a problem. > > Worst case, we may still need a protocol version bump if the enumeration of > STARTUP options is intended to be strict, but at least this would not require > a new message type and would fit into the existing framework for negotiation > between client and server. > > Thoughts, questions, or concerns would be appreciated. > > Cheers, > > Derek > > -- > +---------------------------------------------------------------+ > | Derek Chen-Becker | > | GPG Key available at https://keybase.io/dchenbecker and | > | https://pgp.mit.edu/pks/lookup?search=derek%40chen-becker.org | > | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | > +---------------------------------------------------------------+ >