Hi Ron,

Thanks for the updates. I had a quick look and it is looking good.

I have updated KIP-86 and the associated PR to with a new config
sasl.login.callback.handler.class
that matches what you are using in this KIP.

On Thu, Mar 29, 2018 at 6:27 AM, Ron Dagostino <rndg...@gmail.com> wrote:

> Hi Rajini.  I have adjusted the KIP to use callbacks and callback handlers
> throughout.  I also clarified that production implementations of the
> retrieval and validation callback handlers will require the use of an open
> source JWT library, and the unsecured implementations are as far as
> SASL/OAUTHBEARER will go out-of-the-box. Your suggestions, plus this
> clarification, has allowed much of the code to move into the ".internal"
> java package; the public-facing API now consists of just 8 Java classes, 1
> Java interface, and a set of configuration requirements.  I also added a
> section outlinng those configuration requirements since they are extensive
> (not onerously so -- just not something one can easily remember).
>
> Ron
>
> On Tue, Mar 13, 2018 at 11:44 AM, Rajini Sivaram <rajinisiva...@gmail.com>
> wrote:
>
> > Hi Ron,
> >
> > Thanks for the response. All sound good, I think the only outstanding
> > question is around callbacks vs classes provided through the login
> context.
> > As you have pointed out, there are advantages of both approaches. Even
> > though my preference is for callbacks, it is not a blocker since the
> > current approach works fine too. I will make the case for callbacks
> anyway,
> > using OAuthTokenValidator as an example:
> >
> >
> >    - As you mentioned, the main advantage of using callbacks is
> >    consistency. It is the standard plug-in mechanism for SASL
> > implementations
> >    in Java and keeps code consistent with built-in mechanisms like
> > Kerberos as
> >    well as our own implementations like PLAIN and SCRAM.
> >    - With the current approach, there are two classes OAuthTokenValidator
> >    and a default implementation OAuthBearerUnsecuredJwtValidator. I was
> >    thinking that we would have a public callback class
> > OAuthTokenValidatorCallback
> >    instead and a default callback handler
> >    OAuthBearerUnsecuredJwtValidatorCallbackHandler. So it would be two
> >    classes either way?
> >    - JAAS config is very opaque, we don't log it because it could contain
> >    passwords. Your option substitution classes could help here, but it
> has
> >    generally made it difficult to diagnose failures in the past. Callback
> >    handlers on the the other hand are logged as part of the broker
> configs
> > and
> >    can be easily made dynamically updatable.
> >    - In the current implementation, an instance of  OAuthTokenValidator
> >    is created and configured for every SaslServer, i.e every connection.
> We
> >    create one server callback handler instance per mechanism and cache
> it.
> >    This is useful if we need to make an external connection or load trust
> >    stores etc.
> >
> > For token retriever, I think either approach is fine, since it is tied in
> > with login anyway and would benefit from login manager cache either way.
> >
> > Regards,
> >
> > Rajini
> >
> > On Sat, Mar 10, 2018 at 4:19 AM, Ron Dagostino <rndg...@gmail.com>
> wrote:
> >
> > > Hi Rajini.  Thanks for the great feedback.  See below for my
> > > thoughts/conclusions.  I haven't implemented any of it yet or changed
> the
> > > KIP, but I will start to work on the areas where we are in agreement
> > > immediately, and I will await your feedback on the areas where an
> > > additional iteration is needed to arrive at a conclusion.
> > >
> > > Regarding (1), yes, we can and should eliminate some public API.  See
> > > below.
> > >
> > > Regarding (2), I will change the exception hierarchy so that it is
> > > unchecked.
> > >
> > > Regarding (3) and (4), yes, I agree, the expiring/refresh code can and
> > > should be simplified.  The name of the Login class (I called it
> > > ExpiringCredentialRefreshingLogin) must be part of the public API
> > because
> > > it is the class that must be set via the oauthbearer.sasl.login.class
> > > property.  Its underlying implementation doesn't have to be public, but
> > the
> > > fully-qualified name has to be well-known and fixed so that it can be
> > > associated with that configuration property.  As you point out, we are
> > not
> > > unifying the refresh logic for OAUTHBEARER and GSSAPI, though it could
> be
> > > undertaken at some point in the future; the name "
> > > ExpiringCredentialRefreshingLogin" should probably be used if/when
> that
> > > unification happens.  In the meantime, the class that we expose should
> > > probably be called "OAuthBearerLogin", and it's fully-qualified name
> and
> > > the fact that it recognizes several refresh-related property names in
> the
> > > config, with certain min/max/default values, are the only things that
> > > should be public.  I also agree from (4) that we can stipulate that
> > > SASL/OAUTHBEARER only supports the case where OAUTHBEARER is the only
> > SASL
> > > mechanism communicated to the code, either because there is only one
> SASL
> > > mechanism defined for the cluster or because the config is done via the
> > new
> > > dynamic functionality from KIP-226 that eliminates the
> > > mechanism-to-login-module ambiguity associated with declaring multiple
> > SASL
> > > mechanisms in a single JAAS config file.  Given all of this,
> everything I
> > > defined for token refresh could be internal implementation detail
> except
> > > for ExpiringCredentialLoginModule, which would no longer be needed, and
> > we
> > > only have to expose a single class called OAuthBearerLogin.
> > >
> > > Regarding (5), I'm glad you agree the substitutable module options
> > > functionality is generally useful, and I will publish a separate KIP
> for
> > > it.  I'm thinking the package will be
> > > org.apache.kafka.common.security.optionsubs (I'll gladly accept
> anything
> > > better if anyone can come up with something -- "optionsubs" is better
> > than
> > > "smo" but it still isn't that great, and unfortunately it is the best
> > > relatively short thing I can think of at the moment).  I'll also see
> > what I
> > > can do to minimize the surface area of the API; that discussion can be
> > done
> > > separately as part of that KIP's discussion thread.
> > >
> > > Regarding (6), I agree that exposing the validated token via a publicly
> > > defined SaslServer negotiated property name eliminates the need for the
> > > OAuthBearerSaslServer interface; I will make this change.
> > >
> > > Regarding (7), I agree that retrieving the validated token via a
> callback
> > > would be consistent with other mechanism implementations.  I do have
> one
> > > concern about adopting this approach, though.  The token validation
> > > mechanism is typically going to require a decent amount of
> configuration,
> > > and that configuration is going to live in the login module options.
> It
> > > feels natural for the declaration of the validation mechanism to live
> in
> > > the same place, next to the configuration, which is how it currently
> > > happens in the KIP.  If we change it so that the validation mechanism
> is
> > > declared via the callback handler then we move that declaration
> somewhere
> > > else, where the callback handler class is defined, which is separate
> from
> > > where we define the options that configure it.  I think there is some
> > cost
> > > associated with separating two things that should go together.  Also,
> now
> > > that I think about it, the public API gets bigger with the callback
> > > approach because we trade OAuthBearerTokenValidator for a callback
> > handler
> > > class and a callback class for it to recognize (the cost of 2 vs. 1 is
> > not
> > > much of a difference, but it does exist).  Have I identified these
> costs
> > > correctly, and if so, do you feel the benefit of consistency outweighs
> > > them, in which case I will make the change, or should we keep it the
> way
> > it
> > > is?
> > >
> > > Regarding (8), I wonder if the same cost/benefit analysis applies to
> the
> > > token retriever.  Let's decide on (7) first, then we can decide on (8).
> > >
> > > Thanks again for the great feedback.
> > >
> > > Ron
> > >
> > >
> > > On Thu, Mar 8, 2018 at 9:31 AM, Rajini Sivaram <
> rajinisiva...@gmail.com>
> > > wrote:
> > >
> > > > Hi Ron,
> > > >
> > > > Thanks for the KIP. Sorry for the delay in reviewing this. I have a
> few
> > > > questions/comments.
> > > >
> > > >
> > > >    1. Are all of the classes listed in the KIP intended to be public
> > > >    classes/interfaces? Since it requires more effort to maintain
> public
> > > >    classes, it will be good if we can make more of the.code internal.
> > For
> > > >    example, some of the classes in `oauthbearer.refresh` and `
> > > >    oauthbearer.smo` could be made internal?
> > > >    2. Agree that it is better to use unchecked exceptions. Kafka uses
> > > >    unchecked exceptions elsewhere for the same reasons you described.
> > > >    3. ExpiringCredentialxxx/RefreshConfigxxx: When OAuth is added,
> we
> > > will
> > > >    have two mechanisms using token refresh (Kerberos and OAuth). The
> > KIP
> > > >    doesn't propose to unify the refresh logic for the two (that is
> > fine).
> > > >    Since these interfaces are going to be used just for OAuth, I
> would
> > > keep
> > > >    them internal for now. If we do add another mechanism in future
> that
> > > can
> > > >    reuse this code, we could make them public, taking into account
> any
> > > >    changes required. It doesn't look like we would want to customise
> > > these
> > > > for
> > > >    different OAuthBearer implementations.
> > > >    4. ExpiringCredentialLoginModule/ExpiringCredentialRefreshingLo
> gin:
> > I
> > > >    understand why the interfaces have additional methods to associate
> > > login
> > > >    with mechanism. But in 1.1, we introduced sasl.jaas.config
> property
> > > for
> > > >    brokers, which associates login module to mechanism. The broker
> > > property
> > > >    name is prefixed with listener name and mechanism (e.g.
> > > >    listener.name.sasl_ssl.oauthbearer.sasl.jaas.config). We will
> > > continue
> > > >    to support multiple login modules within a login context in the
> JAAS
> > > > config
> > > >    file for backward compatibility, but I don't think we need to add
> > > >    additional interfaces to support this for new mechanisms since we
> > can
> > > > just
> > > >    use the property instead. With the new property that uses
> different
> > > >    contexts for different mechanisms, LoginManager is different for
> > each
> > > >    context (i.e. each mechanism). So it should be possible to make
> this
> > > >    code simpler. The property also makes it easier to dynamically
> > update
> > > >    configs corresponding to a mechanism.
> > > >    5. SubstitutableModuleOptions: These look very generic and usable
> > for
> > > >    other mechanisms. I think they ought to be in a separate package
> not
> > > > under
> > > >    oauthbearer. It will be good to enable this for PLAIN and SCRAM as
> > > well.
> > > >    This could even be in a separate KIP. Perhaps the package name
> could
> > > be
> > > > a
> > > >    word since smo is not a standard abbreviation?
> > > >    6. OAuthSaslServer: Another option is to keep this internal
> without
> > an
> > > >    additional interface and return OAuthBearerToken from
> > > > *SaslServer.getNegotiatedProperty(String
> > > >    propName)* with a publicly defined property name.
> > > >    7. OAuthBearerTokenValidator: I think this should be defined as a
> > > >    server-side Callback to be consistent with other mechanisms.
> > Different
> > > >    OAuthBearer implementations could just use different callback
> > > handlers,
> > > >    which will be configurable anyway.
> > > >    8. OAuthBearerTokenRetriever: This could perhaps be a login
> callback
> > > if
> > > >    we made the login callback handler configurable.
> > > >
> > > > Regards,
> > > >
> > > > Rajini
> > > >
> > > >
> > > > On Thu, Feb 22, 2018 at 4:16 AM, Ron Dagostino <rndg...@gmail.com>
> > > wrote:
> > > >
> > > > > Hi everyone.  I implemented the ability to perform substitution in
> > JAAS
> > > > > config module options, which was the only part of KIP 255 that was
> > not
> > > > > implemented when I originally published the KIP last week.  I have
> > made
> > > > > adjustments to that section of the KIP based on this implementation
> > > > > experience, including detailing how to add custom substitutions
> > beyond
> > > > the
> > > > > 4 built-in ones (file, system property, environment variable, and
> > > option
> > > > > substitution).  See
> > > > > https://github.com/rondagostino/kafka/commit/548a95822b06b60
> > > > > a92745084a3980d72295d2ce6
> > > > > (code coverage 82%) for the detailed changes.  The KIP code blocks
> > are
> > > > also
> > > > > up-to-date.
> > > > >
> > > > > Ron
> > > > >
> > > > >
> > > > > On Wed, Feb 14, 2018 at 8:11 PM, Ron Dagostino <rndg...@gmail.com>
> > > > wrote:
> > > > >
> > > > > > Thanks, Ted.  I've added the JIRA and mailing list links to the
> > KIP,
> > > > and
> > > > > I
> > > > > > added Javadoc addressing your questions -- both in the KIP code
> > > blocks
> > > > > and
> > > > > > on GitHub (https://github.com/rondagostino/kafka/commit/
> > > > > > c61f5bafad810b620ff1ebd04e1231d245183e36).
> > > > > >
> > > > > > Ron
> > > > > >
> > > > > > On Wed, Feb 14, 2018 at 7:19 PM, Ted Yu <yuzhih...@gmail.com>
> > wrote:
> > > > > >
> > > > > >> Nicely written KIP.
> > > > > >>
> > > > > >> Can you add link to this thread and fill in JIRA number ?
> > > > > >>
> > > > > >> For ExpiringCredential, why does expireTimeMillis() return long
> > > while
> > > > > >> other
> > > > > >> methods return Long ?
> > > > > >> Can you add some comment for WindowJitter in RefreshConfig ?
> > > > > >>
> > > > > >> Thanks
> > > > > >>
> > > > > >> On Wed, Feb 14, 2018 at 3:38 PM, Ron Dagostino <
> rndg...@gmail.com
> > >
> > > > > wrote:
> > > > > >>
> > > > > >> > Hi everyone.
> > > > > >> >
> > > > > >> > I created KIP-255: OAuth Authentication via SASL/OAUTHBEARER
> > > > > >> > <https://cwiki.apache.org/confluence/pages/viewpage.action?
> > > > > >> pageId=75968876
> > > > > >> > >
> > > > > >> >  (https://cwiki.apache.org/confluence/pages/viewpage.
> > > > > >> > action?pageId=75968876
> > > > > >> > ).
> > > > > >> >
> > > > > >> > This KIP proposes adding the ability to authenticate to Kafka
> > with
> > > > > >> OAuth 2
> > > > > >> > bearer tokens using the OAUTHBEARER SASL mechanism.
> > > > > >> >
> > > > > >> > The code blocks in the KIP all reflect the implementation at
> > > > > >> > https://github.com/rondagostino/kafka/tree/KAFKA-4292_plus_
> > > > > oauthbearer.
> > > > > >> > Feel free to look there for more details if the code blocks
> whet
> > > > your
> > > > > >> > appetite for more.  Everything described in the KIP as
> currently
> > > > > worded
> > > > > >> is
> > > > > >> > implemented there (77% code coverage with tests) except for
> the
> > > > > ability
> > > > > >> to
> > > > > >> > perform substitution in JAAS config module options.
> > > > > >> >
> > > > > >> > Ron
> > > > > >> >
> > > > > >>
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to