You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@serf.apache.org by Branko Čibej <br...@apache.org> on 2025/08/06 05:03:16 UTC

Re: Thinking about MFA infrastructure

On 8. 7. 25 17:26, Branko Čibej wrote:
> On 26. 6. 25 08:16, Branko Čibej wrote:
>> On 24. 6. 25 07:52, Branko Čibej wrote:
>>> On 14. 6. 25 21:23, Branko Čibej wrote:
>>>> Hi all,
>>>>
>>>> I've been digging into Serf's support for various authentication 
>>>> schemes and I notices something that looks like a bit of a limitation.
>>>>
>>>> Unless I'm much mistaken, there's space for only one authentication 
>>>> baton in Serf's context. It would seem that this is rather a 
>>>> blocker for implementing multi-factor authentication flows, for 
>>>> example, Basic + OTP, where the server would first require basic 
>>>> credentials and then, if those were correct, go on to issue an OTP 
>>>> challenge.
>>>>
>>>> It seems to me that a simple solution for that would be to store an 
>>>> authn baton per scheme, but I know on the close order of nothing 
>>>> about the possible side effects.
>>>>
>>>> Yeah, I'm starting small, I have no wish to implement OAuth2 flow 
>>>> any time soon. Still, a bit of insight from the knowledgeable would 
>>>> be welcome.
>>>
>>>
>>> With r1926674, I think the user-defined-authn branch is ready for 
>>> review. Here's a short summary of the changes on the branch:
>>>
>>>  * The (private) struct serf__authn_scheme_t, defined in auth/auth.h,
>>>    grew a number of new members to support user-defined schemes, among
>>>    them five new user-visible callback functions. These, along with
>>>    their interactions, are described in serf.h. The built-in
>>>    authentication schemes don't need or use these new members.
>>>
>>>  * The (private) table serf_authn_schemes, defined in auth/auth.c, has
>>>    been extended to have room for as many schemes as there are bits in
>>>    serf__authn_scheme_t::type. Locking was added to serialize access,
>>>    because new schemes can be registered at runtime.
>>>
>>>  * Private callbacks were added to implement the user-visible
>>>    authentication flow.
>>>
>>>  * Two new public APIs take care of registering and unregistering
>>>    authentication schemes. The latter is tricky because we don't track
>>>    references to the schemes in contexts and connections, only in the
>>>    serf_authn_schemes table; this issue is documented.
>>>
>>>  * A number of tests were added for all this new stuff.
>>>
>>>
>>> Please take a look if you have time.
>>>
>>>    svn diff --internal-diff \
>>> https://svn.apache.org/repos/asf/serf/trunk  \
>>> https://svn.apache.org/repos/asf/serf/branches/user-defined-authn \
>>>         | colordiff --color=always \
>>>         | less -R
>>>
>>
>> There are a couple more changes on that branch now:
>>
>>  * The parameters in the authentication challenge (headers
>>    WWW-Authenticate and Proxy-Authenticate) are now parsed into a
>>    dictionary, using the rules described in RFC 9110.
>>
>>  * The Authentication-Info and Proxy-Authentication-Info response
>>    headers are now handled and their values parsed as above.
>>
>> These two changes should make life much easier for authn scheme 
>> implementers. I decided to add this once I saw how many times we have 
>> copy-pasted not-quite-compliant parsers throughout the auth code...
>>
>> (Note that these changes do not stop implementers from doing whatever 
>> wrong-headed, non-compliant horror they can think of, as all the raw 
>> information and headers are still available in the callbacks.)
>
>
> Any takers? It's been a couple of weeks now. I'd sure like to get 
> another pair of eyes on these changes before merging them to trunk, 
> but I'd rather not have the branch fall victim to bitrot, either.

After a month of waiting for feedback, I decided to merge this branch to 
trunk in r1927627. All my testing on several platforms has not shown any 
problems.

-- Brane