[Txauth] The client is identified by its key.

Tom Jones <thomasclinganjones@gmail.com> Tue, 09 June 2020 16:38 UTC

Return-Path: <thomasclinganjones@gmail.com>
X-Original-To: txauth@ietfa.amsl.com
Delivered-To: txauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 852B43A097E for <txauth@ietfa.amsl.com>; Tue, 9 Jun 2020 09:38:37 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Qm0TIh14GS2E for <txauth@ietfa.amsl.com>; Tue, 9 Jun 2020 09:38:34 -0700 (PDT)
Received: from mail-ot1-x331.google.com (mail-ot1-x331.google.com [IPv6:2607:f8b0:4864:20::331]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 493EB3A08AD for <txauth@ietf.org>; Tue, 9 Jun 2020 09:38:34 -0700 (PDT)
Received: by mail-ot1-x331.google.com with SMTP id n70so4667863ota.5 for <txauth@ietf.org>; Tue, 09 Jun 2020 09:38:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=ODSE0AElIypF8N4bJXj0s6YEUB0wIkhqzx4w7nS51Pk=; b=F6+P2kgnxuBrgs3k+bqk9OVn2g0mGyLjJS1b/xUilpjeln41Zkle/aa8fCTes75Xaw mNi4RQjzPCT/0g6HAVvtKIzdOIdu9e6YpjZkhCxob5isXIBPntAfTvetBTQkKSEQyKi7 scDbCjW2/ysn6dcOhAdxgiPvZQHfpUyPiEzLfGZUKEhB0wbdcPXqpoiXtvzAXsVTV8E3 /D6n6BsEVBffrhAgNfch2XzLRyIcGTXcEK8ENOzSCSL8/MVOW/rDTBUxz574EsN4PRD7 rhVGYve6HXCL0hmXVN7n+iF+VdGyXhPAUtth33oON7gAQqMtblkjZYZRB3tfjgCqfsVy FDAQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=ODSE0AElIypF8N4bJXj0s6YEUB0wIkhqzx4w7nS51Pk=; b=SBtr4674hVxGPDAaveIgDA6tA9t9GcHZfl/8U7WyZjT+5B9Nf8d5WGIpAvDUuTbM6j Zn2Or1Tk8kdLZU18wzwGGWOI/k+QOTEcAxA37s64R+KY+y9qbEUpYAhtGtc/O3S2qDUF jzidpi+7FuPHyGffdlHMKGXZC0W/mIGVFjAcL3aEggc+0Ca3G/Oml6OcsdnaxN6Mmz2l UJhU5YG7fA7QStlBfVSgmnLQ9Y/WqD8bnSkwnH3ii7Mo3AejlMCdkl3RYdyYJKaMryHz nLko+v6PANFC2fhIycbJWUQfaAbrLsaU1ohSDghF9w32KcTqqmL8RJj5mKEANi7aFTm6 QVtQ==
X-Gm-Message-State: AOAM532IoadVsqu7Sy0uFgNutdYIqBrOrW+Lz401Tjn8NP/JoS7xFXQ1 hdE+mcL/xcLzzFBLptuF9+gQf4HaoHZm/WgRMUU43foota8=
X-Google-Smtp-Source: ABdhPJwsU8D29IImUiWJTt77xY++2dg9yAmMPv5vMk7GXtZ0/GTUtMWpda3pQT7Y9HzNgxtWt5r0gJEnkwKbBSjZzxw=
X-Received: by 2002:a05:6830:3151:: with SMTP id c17mr23422005ots.143.1591720713117; Tue, 09 Jun 2020 09:38:33 -0700 (PDT)
MIME-Version: 1.0
From: Tom Jones <thomasclinganjones@gmail.com>
Date: Tue, 09 Jun 2020 09:38:21 -0700
Message-ID: <CAK2Cwb4vue-VRhC7x+DTM2UFrrLM3qdYXHfYJnV71Tqx6Wqm8w@mail.gmail.com>
To: txauth@ietf.org
Content-Type: multipart/alternative; boundary="000000000000afe66b05a7a95b4c"
Archived-At: <https://mailarchive.ietf.org/arch/msg/txauth/Jge37G7DG8qf4bzZ6ggQmxVvlIs>
Subject: [Txauth] The client is identified by its key.
X-BeenThere: txauth@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: <txauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/txauth>, <mailto:txauth-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/txauth/>
List-Post: <mailto:txauth@ietf.org>
List-Help: <mailto:txauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/txauth>, <mailto:txauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 09 Jun 2020 16:38:38 -0000

*This needs to be its own thread. I see the same trend in OpenID for
self-issued subject identification. I cannot imagine how key roll-over
could possibly work without major disruption to ongoing activity.  Someone
must show that key rollover in a fully functioning system is possible
before it is even considered.*

*from justin*

*The client is identified by its key.* There is no external client
identifier. I think you’re confused because you’re still thinking in terms
of OAuth 2’s client ID based model and I am trying to move us past that. It
took me time to realize that we really can let it go, so hopefully this is
helpful in explaining why.

When a credential is cryptographically random enough to be unique, it can
be used as its own identifier, particularly when you don’t need to identify
the entity outside of the context that it can present and prove its
credential. To stretch a metaphor, passwords don’t always need usernames.
This is, after all, the driving design pattern behind OAuth access tokens.
An access token doesn’t have a “username” portion to it, even though it
would have been trivial to require the client to send its client ID
alongside the access token. Why does that work? Because our model of what
the RS does with the access token is built around it answering the
questions: is this token valid and does it allow what’s being requested? If
the RS needs to know which client was issued the token, it can discover
that information without being told separately from the token -- perhaps
it’s in the token itself or it’s in an introspection response. And in a lot
of cases, the RS doesn’t care about the client software, it just wants to
know if the token’s any good. Even in constrained tokens such as MTLS, PoP,
and DPoP, we aren’t really authenticating the client at the RS so much as
making sure the right key is presented alongside the right token.

XYZ takes that same approach with the client talking to the AS and uses the
credential (key) to identify the client as well as authenticate and protect
the request. We can’t just say “OAuth 2 had client IDs and people are used
to it so it must be good and we have to keep using it”. We need to ask WHY
OAuth 2 needs client IDs and if that still makes sense. I argue that it
doesn’t make sense anymore and we need to step back and look at a better
model. OAuth 2 needs a client ID because it gets passed in the front
channel and the client’s credentials can’t be used there. The access token
doesn’t need an equivalent because it’s passed in the back channel and can
be used directly. Now that the client no longer needs to be identified, but
not authenticated, through untrusted third parties (such as the browser),
we don’t need to have a separate identifier as part of the protocol. With
an intent-based protocol, that starts in the back channel, you don’t need a
client identifier anymore. Once the AS finds that key, the AS can then
figure out what policies, rights, and restrictions are attached to that
key. In many implementations, there’s going to be some kind of “registered
client” object in a database somewhere that drives those policies. That’s
the classical OAuth model, and it works in many cases. But in other cases,
the key is going to just be a value used to protect the request chain (and
possibly the token itself), and the policy is going to be built up by other
things like a device posture or signature on the calling software or
verified user information. It’s not just about client authentication, even
though it can be used for it. DPoP, PKCE, and DynReg have shown us the
value in dynamic systems, in different ways.

On top of that, PAR is showing us that a lot of the constraints that we
have in OAuth 2 don’t really apply anymore. For instance, Redirect URI
restrictions can be relaxed because now you CAN identify and authenticate
the software sending it, which isn’t true with a front-channel-first
approach. All of the things that are required in OAuth 2 start to become
redundant, and it leads to things like requiring that “client_id” still
always be passed in the front channel even though the information could be
looked up from an internal request_uri reference using PAR and JAR together.

That’s why a key handle isn’t exactly the same as a client ID and I did not
call it a client ID in the XYZ protocol. It’s a shortcut to refer to the
key material for certain optimized cases, but ultimately it’s pointing to a
key. This has an interesting and beneficial side effect — if you HAVE a
client ID as part of your internal data model, it can FUNCTION as a key
handle because it’s a unique value the AS can use to look up key
information. It’s not “authenticating the client”, it’s pointing to a key
which in turn identifies and authenticates the software making the call.
The fact that it’s a “client ID” is an artifact of the implementation,
which in this case has an OAuth 2 legacy to work with.

If we’re going to move past the constraints of OAuth 2 we need to stop
thinking so strictly in its terms and models. There are better ways to
approach this now and client IDs are not required by this protocol model.
Peace ..tom