[
https://issues.apache.org/jira/browse/HADOOP-6373?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12777675#action_12777675
]
Kan Zhang commented on HADOOP-6373:
-----------------------------------
Attaching a preliminary patch to facilitate discussions on how code should be
structured and what interfaces should be adopted. It's incomplete, but should
suffice for a high-level discussion.
A few new classes are introduced in the patch. DelegationTokenHandler is the
main class. It is responsible for choosing master keys and updating them. It
also uses master keys to generate, re-generate or verify tokens. Master keys
are not exposed. One must invoke methods on a DelegationTokenHandler for
operations involving master keys. A DelegationTokenHandler is only needed on
the server-side. Client uses tokens generated by a handler and does not require
access to the handler.
DelegationToken is the token object generated by the handler and sent to the
client over the wire. It supports serialization and should contain methods that
are necessary for the client to use the token. A token has two fields, tokenID
and tokenAuth. When used for authentication, tokenID is effectively used as
username and tokenAuth is the password. A client doesn't need to understand
what is encoded in the tokenID. Both fields are opaque to the user. TokenID can
be used to encode as many data items as necessary and server needs to be able
to encode and decode those items. That logic is captured in the handler. We may
add different types of tokens in the future and each type will have its own
handler. The tokens generated by different handlers may have different types
but otherwise look similar to the client.
Note that client needs to be able to find out who the tokenIssuer is so that it
can pick the right token to use from its cache (a token can only be used
against its issuing server). A tokenIssuer field or getTokenIssuer() method
needs to be added to DelegationToken or its superclass Token. Let's ignore this
issue for now.
An alternative design is to break tokenID into individual data items and store
those items as separate fields inside the token. TokenID can be computed on
demand from those fields. The benefit is that users are able to retrieve those
fields without de-serializing. However, apart from tokenIssuer mentioned above
and possibly expirationDate, it's unclear the client needs to know anything
more about the token. Moreover, different types of tokens may require different
fields and it would be harder to abstract a common Token class than the opaque
model. Maybe we should just separate out tokenIssuer and expirationDate, and
put everything else into an opaque field, which only the handler understands.
Another alternative is to move operations that use master keys from
DelegationTokenHandler to DelegationToken, making the handler a key storage
facility and doesn't care about how keys are used. However, the keys need to be
used to initialize Mac objects, which are then used to compute tokenAuth. It's
better to share a single Mac object for each key. The handler provides a
convenient place to synchronize accesses to the shared Mac object.
Conceptually, a token is a credential and once it's generated it doesn't
change. The client that uses a token never needs to re-compute tokenAuth or
needs access to the key. The server does need access to the key and it seems a
good idea to hide the key in a single place - the handler, where all the key
management is happening.
Thoughts?
> adding delegation token implementation
> --------------------------------------
>
> Key: HADOOP-6373
> URL: https://issues.apache.org/jira/browse/HADOOP-6373
> Project: Hadoop Common
> Issue Type: Sub-task
> Reporter: Kan Zhang
> Assignee: Kan Zhang
> Attachments: partial1.patch
>
>
> The over-all design of delegation token is given in HADOOP-4343. This subtask
> is for detailed design and implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.