[OAUTH-WG] For review/discussion: externalizing the token issuance decision to a policy decision point

Omri Gazitt <ogazitt@gmail.com> Wed, 05 August 2026 06:39 UTC

Return-Path: <ogazitt@gmail.com>
X-Original-To: oauth@mail2.ietf.org
Delivered-To: oauth@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id BF5F4123E8DDB for <oauth@mail2.ietf.org>; Tue, 4 Aug 2026 23:39:53 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1785911993; bh=+f9/oI37XinNgc5RopGPH9sc34teeQvJ8rTJGdOLeJA=; h=References:In-Reply-To:From:Date:Subject:To; b=bWK5NFT6hqCz/TY8abs3yCmPatRmcfLZmLjqsB3FhXeghWofuhUlmlWTlVBzLJZfG ytoN1T7JR3eIczxQMAKau4jakBL0HXDYcZhfdip2JQYBMqHuAqIIjoiE1BhSspfjqn lil3g8g8aGoXCguwpU+lMHXS82rsZM/xQGraguYk=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.088
X-Spam-Level:
X-Spam-Status: No, score=-2.088 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_KAM_HTML_FONT_INVALID=0.01] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id b0K3Hw5cCa_T for <oauth@mail2.ietf.org>; Tue, 4 Aug 2026 23:39:51 -0700 (PDT)
Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id A1501123E8DC8 for <oauth@ietf.org>; Tue, 4 Aug 2026 23:39:51 -0700 (PDT)
Received: by mail-qk1-x72c.google.com with SMTP id af79cd13be357-92f0b5ed131so55572785a.3 for <oauth@ietf.org>; Tue, 04 Aug 2026 23:39:51 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1785911985; cv=none; d=google.com; s=arc-20260327; b=TX+Y7yfnFuVRnGGa11RlHywvz6imydaaU8fGjOAkLoN9Niu3hWtLsrRRr+eRVUfXZE 9O479CERONfRbArJRGX9j6bAl7Ec4JXFAF+Aoqkxc4/sEmYkhRm9TLvhI0vIRyyAk3Za ojqqDjd+357F5zbgdaWTNzh3muL4G0+YKJ40NRs2z4F7WJxrdjpMr9Nzf7pXgQ9DRhFf vn8JxxjzQSA56KlBIiOCI8TEgkXf6GDJXcFwmsbW6OaV5j6NyNXkF4KdzZghUOWLwlX7 UpgQOyFdsrnEJn+Cbc7p7+h/J4lIg6w8Iq9lNW3KWeP4xPKLN0N6F2S+FuQUq85HGQ/C VDIw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=GERkpRPW8/01NPPnRyE5n6/Y9Dyim5XYey+yfqdCg+Q=; fh=HRwJNtTTtPgtfgvXyPaPq+Te1JrkxlJZMfmgN30AIzQ=; b=dGCVB/VVrmbponob7nsf1V4cKcyelRcb1vWE/aGjMXfLaQlR0SQrabAJeIqCPWFR8s sOHStTpdpzgp/02l8NhQtS3D+/b4k9PpsIq28e8hBcMAleYK7fqd/otg8FAwNyM3v5vj y6A98Bf1N6jsPhzY+7D+67Njg7kaouCQUIJLg8Hv1XawvPLMyNhJMcB4il0JjbUjZ0Er 8ngSUfebvoaSgwnUDERZFhBLFZ5V9QKnkLnMLQlEqB+G/eDotwIgKhxKup/wzL/+h/tp g+jtE1O4r519McCyvZEB17PTT+NKiaWo66tfhajDX1Vj7ilCHND5MIK4QSpFgKzuLGyI 1TnA==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785911985; x=1786516785; darn=ietf.org; h=content-type:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=GERkpRPW8/01NPPnRyE5n6/Y9Dyim5XYey+yfqdCg+Q=; b=hGqClH0fG6yTAnwwQtXGtasPdXT04kRVEa4Vdp5vAuwiLPHNk0DQeYEjQTVWPuXgWE KaeL7i6oWj55YLFXE3U2jBJr2SExVWWqTWQ9BpmHxU3Vu+ZFFK8jR7NapJhsOmzGFs38 SKBlBx4FHyPMiPVRMuLlLhUpgh2JSDziHOPq02y2j2hIF5lvGhH4YokmeLCVz9H74GYn Ejjilrapu3Z4YFNbThhyf/PCKu0+83RkZbrCWxehPUVr9cKuOv7O7Z8AXFOjW2VLITvC OgJUfvOeNN9De3BmDKD4T/37guqRbsL4PouQXWxd+bS8TqVnaSDGKWfS7E2JZ2IJgoNr GJvg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785911985; x=1786516785; h=content-type:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GERkpRPW8/01NPPnRyE5n6/Y9Dyim5XYey+yfqdCg+Q=; b=GybU9oM60rFO1t9brKsfx6UWonKDCLlKSHtM+cPFOERQEQSS8Ksg4TrVpl5Dk/Lucc eUr729PyY57Q52Fr1e/m3EZox7FsSfy4AjWNakrNKYpzLRTZQEOjRYv5EfZEdthaLsab pzhmFY7uUyJ4Sbyg5T2li+ZKchx3qneV3O8VuEZg/st91pWuVs7IPtmIWYH6FlPrIqhh EPuYjGiD6jUu5Sc1X2UMTpUmFGpxwSoiy58e43ZSF/GwOWRuJ4GNTEiOyQ9r7eycEQ/l EbKAEAjv3c/GO3a2fn6crk2LZs+5v6ZE7Nst+plMRiY+oG390z29I/GvFSJHlkWAauAt 93tQ==
X-Gm-Message-State: AOJu0YwVQaA+R7l6eTgGbOR4+PvXUcPmSmqDLiUsoH0J/UREa7jebhnD pBV8k2NMgG8mepbf4t/JOEB/IWp6s+SW/Y38CiVUtC5v/YnYvSR7q+0N0+KZqA4jracOs5urgEH RmErk2WjGTIt/yL3u3K/r2wv8V9tke9Apj2in
X-Gm-Gg: AR+sD11M1uS7zDP7Djg/EXEEhtmVsrB72zM3/f88SavHtl/rxzNq8VPWBQRBmnu6sLy kwGAlFArJVnXeR59cqGOPyADM09mEVQIX8Ag36+SBtEmLVgcMqafIcqj3COLYP8/W6aWI1syz5m g8gMZV+gyaTTXdogSMPoV+4GuQhdZN8CxBliRj3MThvb+m7k7Sn8KrIJ7sXOgH3ljM/3L0+cYgX CyVxDDvwA6oJLgcoOavlYRFL6KM3AMyILkioGs4CbEQZjOjK2tNXTINpyfOOaMvH053yoCSeCxE Hrl4XEvdnco2AeVXzNoDemLLkBso72YpTERuFeIsSZgt1UQahx/oaULMJ2/yFQqLML0JuOr6z3Z 2sEVgSO7+iUrS+ag5RJrvOcoyO39yAtmJCg8zI2C+L3t5b0EDDp8DBY/ProE=
X-Received: by 2002:a05:620a:3998:b0:915:efa6:d718 with SMTP id af79cd13be357-9364921c73cmr303658985a.47.1785911985160; Tue, 04 Aug 2026 23:39:45 -0700 (PDT)
MIME-Version: 1.0
References: <178590995124.751.14146951656452241248@dt-datatracker-54dc84885d-42kkg>
In-Reply-To: <178590995124.751.14146951656452241248@dt-datatracker-54dc84885d-42kkg>
From: Omri Gazitt <ogazitt@gmail.com>
Date: Tue, 04 Aug 2026 23:39:34 -0700
X-Gm-Features: AUfX_mzE21oFHje4Rfb8DrzjwRQPo3LMRMuex8FyIzbbjIK4g_steiZXpwV_7cY
Message-ID: <CAHG5M7CKvDf4g72nw7MBpBDjOn4honEebN6sFTHSgT3LPaXzew@mail.gmail.com>
To: oauth@ietf.org
Content-Type: multipart/alternative; boundary="00000000000079c5bf0658470959"
Message-ID-Hash: IEK6JLPBB4NV3XKQCBRXAOZSZZKZAVRJ
X-Message-ID-Hash: IEK6JLPBB4NV3XKQCBRXAOZSZZKZAVRJ
X-MailFrom: ogazitt@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-oauth.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [OAUTH-WG] For review/discussion: externalizing the token issuance decision to a policy decision point
List-Id: OAUTH WG <oauth.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/O0DUaMCsgRzFRkieDrUez1p7M_4>
List-Archive: <https://mailarchive.ietf.org/arch/browse/oauth>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Owner: <mailto:oauth-owner@ietf.org>
List-Post: <mailto:oauth@ietf.org>
List-Subscribe: <mailto:oauth-join@ietf.org>
List-Unsubscribe: <mailto:oauth-leave@ietf.org>

Hi folks,

Yaron Sheffer's thread
<https://mailarchive.ietf.org/arch/msg/oauth/CCvvii3fjQWYczpYgzVC2Aoa9-U/>
in June/July on standardizing a policy language framed the question as one
about scope: whether authorization policy, kept out of OAuth's scope for
years, is due for a revisit. That thread took up policy on the OAuth wire.
I have submitted two drafts about the other half of it, policy behind the
wire, which I don't think has been discussed here much if at all.

It also sidesteps the hardest part of Yaron's question. Agreeing on how an
authorization server poses the question does not require agreeing on the
language the policy is written in, and OpenID AuthZEN 1.0 already defines
how to structure the question. [In full disclosure, I am a former co-chair
of the OpenID AuthZEN working group and an editor of the Authorization API.]

The observation the drafts start from is that a long list of OAuth
specifications define a moment at which an authorization server decides
whether to issue a token, and every one of them declines to define the
decision. Transaction Tokens is the bluntest about it: "the authorization
policy for determining such issuance is out of scope for this
specification." RFC 8693 and Identity Chaining each do the same thing in a
subordinate clause. ID-JAG gets closest, and describes an interface in
prose: the AS "evaluates administrator-defined policy [...] and determines
if the client should be granted access to act on behalf of the subject for
the target audience, resources, scopes, and authorization details," and
adds that granted scopes may be a subset of those requested.

Each of those is the right editorial call for the document it appears in.
My observation is only that the same call made four times leaves the most
security-relevant step in issuance with no interoperable expression, and
that the industry has needed to fill this gap: five major authorization
servers ship a proprietary extension point at exactly this moment, and only
one of the five can refuse to issue.

The drafts profile the OpenID AuthZEN Authorization API for that moment,
casting the AS as a policy enforcement point:

   - AuthZEN Profile for OAuth 2.0 Token Issuance
   <https://datatracker.ietf.org/doc/draft-gazitt-oauth-authzen-issuance/>
   - the mapping from a token request onto AuthZEN's five-tuple, and the rules
   by which a decision may shape the issued token. §4 covers the deployment
   question of whether an authorization server can afford a policy call at
   issuance rates.
   - AuthZEN Binding for OAuth 2.0 Token Exchange
   <https://datatracker.ietf.org/doc/draft-gazitt-oauth-authzen-token-exchange/>
-
   the binding for RFC 8693 and the family that inherits its seam: identity
   chaining, ID-JAG and transaction tokens, where a request names a second
   party whose authority is separately at stake.

Nothing here changes anything on the OAuth wire. A client cannot tell
whether the AS consulted a policy decision point, and no new parameter,
endpoint or error code is defined. That is deliberate, and it is also the
crux of question 1 below.

Open questions. These are also filed as issues here
<https://github.com/ogazitt/oauth-authzen/issues> if a reply is easier
there than on the list, though I would rather have it here.

1. *Is this in scope for OAuth at all?* Because the profile is invisible on
the wire, there is a real argument that it belongs at the OpenID Foundation
as an AuthZEN profile, and I have had that feedback directly. The counter
is that the sentences being filled in are in this working group's
documents, and its participants are the ones who wrote them. Question 2 is
the sharpest version of this: whatever the answer is, it is not one the
OpenID Foundation can give. I would rather ask than assume.

2. *What should an AS return when policy refuses?* I could not find
a consistent answer, and I would like to be told I missed one. RFC
8693 section 2.2.2 says `invalid_request` where the presented tokens
are unacceptable on
policy grounds. Identity Chaining points at RFC 7523 section 3.1, whose
own MUST is about JWT validity rather than policy, and which lands
on `invalid_grant`. ID-JAG and Transaction Tokens describe the permit
branch and
leave the deny branch unwritten. If the answer is that `invalid_grant` is
the understood catch-all and the coarseness is deliberate, that is a fine
answer, and I would rather write it down than have a profile invent
 something.

3. *Is a new IANA registry the right way to name the gate action?* It is
currently `issue:<token-type>:<grant-type>` built from registered
short names, in a new registry, rather than from the existing grant type
URIs. The reason is that policy engines have real length and
character constraints on relation identifiers, but I am not confident this
is the right trade and it is the kind of naming call this working group
is better at than I am.

4. *Is "may narrow, never broaden" the right invariant for the
response?* (section
6.3 of the issuance draft, and the rule I would most like challenged.) A
decision may shorten a lifetime, drop scopes or tighten an audience, and
may never add authority. Everything else in the response handling falls out
of it, including which fields an implementation may ignore. If there is a
legitimate case for a policy decision point adding authority at issuance,
the design is wrong and I would like to hear it now.

There is a longer write-up <https://notes.ogazitt.com> of the argument,
including the survey behind the five-vendor claim above. Next steps include
implementing the drafts with a Keycloak module rather than leave them on
paper, and would take that work in whichever direction the answer to
question 1 points.

Thanks!
Omri.

--
Omri Gazitt

---------- Forwarded message ---------
From: <internet-drafts@ietf.org>
Date: Tue, Aug 4, 2026 at 11:05 PM
Subject: New Version Notification for
draft-gazitt-oauth-authzen-issuance-00.txt
To: Omri Gazitt <ogazitt@gmail.com>


A new version of Internet-Draft draft-gazitt-oauth-authzen-issuance-00.txt
has
been successfully submitted by Omri Gazitt and posted to the
IETF repository.

Name:     draft-gazitt-oauth-authzen-issuance
Revision: 00
Title:    AuthZEN Profile for OAuth 2.0 Token Issuance
Date:     2026-08-05
Group:    Individual Submission
Pages:    36
URL:
https://www.ietf.org/archive/id/draft-gazitt-oauth-authzen-issuance-00.txt
Status:
https://datatracker.ietf.org/doc/draft-gazitt-oauth-authzen-issuance/
HTML:
https://www.ietf.org/archive/id/draft-gazitt-oauth-authzen-issuance-00.html
HTMLized:
https://datatracker.ietf.org/doc/html/draft-gazitt-oauth-authzen-issuance


Abstract:

   Numerous OAuth 2.0 specifications define a moment at which an
   authorization server decides whether to issue a security token, and
   each of them declares the decision itself to be a matter of local
   policy that is out of scope.  The result is that a decision common to
   every OAuth deployment has no interoperable expression.

   This document defines a profile for using the OpenID AuthZEN
   Authorization API to externalize that decision to a Policy Decision
   Point.  It specifies how the inputs to a token issuance request map
   onto AuthZEN's mandatory five-tuple, how a Policy Decision Point
   response may shape the issued token, and how the two parties discover
   each other's capabilities.

   The mapping is complete for grants whose request names a single party
   and a single target, including the authorization code and client
   credentials grants.  Companion documents bind the grant families that
   add structure this document does not model, the token exchange family
   first among them.



The IETF Secretariat