Re: [Txauth] Key handle vs client id & handle

Justin Richer <> Mon, 13 July 2020 13:48 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 2F2343A11F1 for <>; Mon, 13 Jul 2020 06:48:37 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -1.92
X-Spam-Status: No, score=-1.92 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=unavailable autolearn_force=no
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id FTDUaoiINGkZ for <>; Mon, 13 Jul 2020 06:48:35 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 740BB3A11EF for <>; Mon, 13 Jul 2020 06:48:35 -0700 (PDT)
Received: from [] ( []) (authenticated bits=0) (User authenticated as jricher@ATHENA.MIT.EDU) by (8.14.7/8.12.4) with ESMTP id 06DDmTNr005598 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 13 Jul 2020 09:48:30 -0400
Content-Type: text/plain; charset=utf-8
Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.\))
From: Justin Richer <>
In-Reply-To: <>
Date: Mon, 13 Jul 2020 09:48:29 -0400
Cc:, Mike Jones <>
Content-Transfer-Encoding: quoted-printable
Message-Id: <>
References: <>
To: Dick Hardt <>
X-Mailer: Apple Mail (2.3608.
Archived-At: <>
Subject: Re: [Txauth] Key handle vs client id & handle
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Mon, 13 Jul 2020 13:48:37 -0000

The problem I have with this approach is that it artificially encodes two, and only two, tiers of client within the protocol needlessly. In my experience with systems that support dynamic registration, it’s not a black and white world like that. There are clients who can present :some: form of proof that they’re legit, but they haven’t been statically registered with the AS. (See MODRNA and OBUK, for instance.) There are clients whose identities are tied explicitly to the current user (like a Solid pod). There are clients who are “statically” registered but through a developer-facing portal, vs clients that are registered through an admin-only interface. 

As you say below, if the AS needs to differentiate between classes, it can decide to do so based on the key or identifier and the policies associated with it. I disagree with encoding these two tiers, or any tiers, into the protocol itself. This is ultimately a matter of the AS and its policy. In OAuth 2 there is no differentiation between a “static” or “dynamic” client ID, and yet an AS today can still differentiate between them — because it knows the context in which the client ID was generated. It’s the same with the “key handle” concept in XYZ: the AS knows where the handle came from and can apply different policies regardless. 

Now, it’s a bigger question what the “handle” refers to. XYZ started with it being tied to “all client software information” and then broke it into pieces, with the “key” portion being the cornerstone piece. While I still think this makes sense, I think that’s something that GNAP needs to figure out with more input from the community than just my own experience.

 — Justin

> On Jul 10, 2020, at 4:16 PM, Dick Hardt <> wrote:
> + Mike as he had interest in this topic
> My understanding is that an existing OAuth 2 client would use their current client id as their key handle, and a dynamic client (one that was not pre-registered) would be given a key handle by the AS.
> There are potentially some significant differences between a registered client, and a dynamic client to an AS.
> The AS is likely to know the identity of a registered client, and have different policies between the two types of clients. For example, a registered client may have access to a 'write" scope, while a dynamic client does not.
> The AS may have 100s or 1000s of registered clients, but a dynamic client may have 10Ms or 100Ms of instances, which may dictate separate storage services. Additionally, internal to the AS, which systems can write to the registered client store is going to be different than the dynamic client store.
> In XYZ, subsequent calls to the AS, both registered clients and dynamic clients pass a key handle, so there is no easy way to differentiate between the two.
> While the AS could embed semantics in the key handle identifier to indicate which identifiers are pre-registered vs dynamic, there are many cases where the AS does need to know the difference, so making the difference a feature of GNAP seems like a better path.