I have made a minor change to the callback handler interface to pass in the JAAS configuration entries in *configure,* to work with the multiple listener configuration introduced in KIP-103. I have also renamed the interface to AuthenticateCallbackHandler instead of AuthCallbackHandler to avoid confusion with authorization.
I have rebased and updated the PR (https://github.com/apache/kafka/pull/2022) as well. Please let me know if there are any other comments or suggestions to move this forward. Thank you... Regards, Rajini On Thu, Dec 15, 2016 at 3:11 PM, Rajini Sivaram <rsiva...@pivotal.io> wrote: > Ismael, > > The reason for choosing CallbackHandler interface as the configurable > interface is flexibility. As you say, we could instead define a simpler > PlainCredentialProvider and ScramCredentialProvider. But that would tie > users to Kafka's SaslServer implementation for PLAIN and SCRAM. > SaslServer/SaslClient implementations are already pluggable using standard > Java security provider mechanism. Callback handlers are the configuration > mechanism for SaslServer/SaslClient. By making the handlers configurable, > SASL becomes fully configurable for mechanisms supported by Kafka as well > as custom mechanisms. From the 'Scenarios' section in the KIP, a simpler > PLAIN/SCRAM interface satisfies the first two, but configurable callback > handlers enables all five. I agree that most users don't require this level > of flexibility, but we have had discussions about custom mechanisms in the > past for integration with existing authentication servers. So I think it is > a feature worth supporting. > > On Thu, Dec 15, 2016 at 2:21 PM, Ismael Juma <ism...@juma.me.uk> wrote: > > > Thanks Rajini, your answers make sense to me. One more general point: we > > are following the JAAS callback architecture and exposing that to the > user > > where the user has to write code like: > > > > @Override > > public void handle(Callback[] callbacks) throws IOException, > > UnsupportedCallbackException { > > String username = null; > > for (Callback callback: callbacks) { > > if (callback instanceof NameCallback) > > username = ((NameCallback) callback).getDefaultName(); > > else if (callback instanceof PlainAuthenticateCallback) { > > PlainAuthenticateCallback plainCallback = > > (PlainAuthenticateCallback) callback; > > boolean authenticated = authenticate(username, > > plainCallback.password()); > > plainCallback.authenticated(authenticated); > > } else > > throw new UnsupportedCallbackException(callback); > > } > > } > > > > protected boolean authenticate(String username, char[] password) > throws > > IOException { > > if (username == null) > > return false; > > else { > > String expectedPassword = > > JaasUtils.jaasConfig(LoginType.SERVER.contextName(), "user_" + username, > > PlainLoginModule.class.getName()); > > return Arrays.equals(password, expectedPassword.toCharArray() > > ); > > } > > } > > > > Since we need to create a new callback type for Plain, Scram and so on, > is > > it really worth it to do it this way? For example, in the code above, the > > `authenticate` method could be the only thing the user has to implement > and > > we could do the necessary work to unwrap the data from the various > > callbacks when interacting with the SASL API. More work for us, but a > much > > more pleasant API for users. What are the drawbacks? > > > > Ismael > > > > On Thu, Dec 15, 2016 at 1:06 AM, Rajini Sivaram <rsiva...@pivotal.io> > > wrote: > > > > > Ismael, > > > > > > 1. At the moment AuthCallbackHandler is not a public interface, so I am > > > assuming that it can be modified. Yes, agree that we should keep > > non-public > > > methods separate. Will do that as part of the implementation of this > KIP. > > > > > > 2. Callback handlers do tend to depend on ordering, including those > > > included in the JVM and these in Kafka. I have specified the ordering > in > > > the KIP. Will make sure they get included in documentation too. > > > > > > 3. Added a note to the KIP. Kafka needs access to the SCRAM credentials > > to > > > perform SCRAM authentication. For PLAIN, Kafka only needs to know if > the > > > password is valid for the user. We want to support external > > authentication > > > servers whose interface is to validate password, not retrieve it. > > > > > > 4. Added code of ScramCredential to the KIP. > > > > > > > > > On Wed, Dec 14, 2016 at 3:54 PM, Ismael Juma <ism...@juma.me.uk> > wrote: > > > > > > > Thanks Rajini, that helps. A few comments: > > > > > > > > 1. The `AuthCallbackHandler` interface already exists and we are > making > > > > breaking changes (removing a parameter from `configure` and adding > > > > additional methods). Is the reasoning that it was not a public > > interface > > > > before? It would be good to clearly separate public versus non-public > > > > interfaces in the security code (and we should tweak Gradle to > publish > > > > javadoc for the public ones). > > > > > > > > 2. It seems like there is an ordering when it comes to the invocation > > of > > > > callbacks. At least the current code assumes that `NameCallback` is > > > called > > > > first. If I am interpreting this correctly, we should specify that > > > > ordering. > > > > > > > > 3. The approach taken by `ScramCredentialCallback` is different than > > the > > > > one taken by `PlainAuthenticateCallback`. The former lets the user > pass > > > the > > > > credentials information while the latter passes the credentials and > > lets > > > > the user do the authentication. It would be good to explain the > > > > inconsistency. > > > > > > > > 4. We reference `ScramCredential` in a few places, so it would be > good > > to > > > > define that class too. > > > > > > > > Ismael > > > > > > > > On Wed, Dec 14, 2016 at 7:32 AM, Rajini Sivaram < > > > > rajinisiva...@googlemail.com> wrote: > > > > > > > > > Have added sample callback handlers for PLAIN and SCRAM. > > > > > > > > > > On Tue, Dec 13, 2016 at 4:10 PM, Rajini Sivaram < > > > > > rajinisiva...@googlemail.com> wrote: > > > > > > > > > > > Ismael, > > > > > > > > > > > > Thank you for the review. I will add an example. > > > > > > > > > > > > On Tue, Dec 13, 2016 at 1:07 PM, Ismael Juma <ism...@juma.me.uk> > > > > wrote: > > > > > > > > > > > >> Hi Rajini, > > > > > >> > > > > > >> Thanks for the KIP. I think this is useful and users have asked > > for > > > > > >> something like that. I like that you have a scenarios section, > do > > > you > > > > > >> think > > > > > >> you could provide a rough sketch of what a callback handler > would > > > look > > > > > >> like > > > > > >> for the first 2 scenarios? They seem to be the common ones, so > it > > > > would > > > > > >> help to see a concrete example. > > > > > >> > > > > > >> Ismael > > > > > >> > > > > > >> On Tue, Oct 11, 2016 at 7:28 AM, Rajini Sivaram < > > > > > >> rajinisiva...@googlemail.com> wrote: > > > > > >> > > > > > >> > Hi all, > > > > > >> > > > > > > >> > I have just created KIP-86 make callback handlers in SASL > > > > configurable > > > > > >> so > > > > > >> > that credential providers for SASL/PLAIN (and SASL/SCRAM when > it > > > is > > > > > >> > implemented) can be used with custom credential callbacks: > > > > > >> > > > > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP- > > > > > >> > 86%3A+Configurable+SASL+callback+handlers > > > > > >> > > > > > > >> > Comments and suggestions are welcome. > > > > > >> > > > > > > >> > Thank you... > > > > > >> > > > > > > >> > > > > > > >> > Regards, > > > > > >> > > > > > > >> > Rajini > > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Regards, > > > > > > > > > > > > Rajini > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > Regards, > > > > > > > > > > Rajini > > > > > > > > > > > > > > >