OAuth @ IETF124

Monday 11/3/2025

Chairs update – 15 min

4 drafts nearing completion

token status - in IESG LC

browser based apps - waiting for cookies

SDJWT - with RFCEd

Cross-device - waiting for writeup (hannes writing up now)
Pieter: outstanding pieces are waiting for confirmation, just arrived at
mailing list 20 minutes ago.

ID Chaining - in WGLC, waiting for shepherds
Riffat: we'll pick it up after

SD-JWT VC - Brian (20 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/

Question/comments

Hannes: Who has read the most recent version? (lots of changes, is this
a rewrite?)

Identity Assertion Authorization Grant - Aaron/Brian (20 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/

Refresh Tokens:

Jeff: when you refresh, you don't necessarily get an ID Token; you might
not expect an ID-JAG
To consider ID token and ID-JAG as equivalent?
Aaron: consider IDT and RT as equivalent, then need to get a new ID-JAG.
Today, RT used to get IDT then ID-JAG. Goal is to replace step 3

Justin: Not a universal pattern, with offline access maybe we can signal
I want this refresh token to have this behavior - getting into scopes, a
little crazy but as crazy as expecting everyone to return RT on every
response.
Aaron: this is a strong reason to include the RT
Justin: We didn't think of this in OAuth2 but maybe if we could define a
semantic way to carry in the request, perhaps this draft can tackle it.

Brian: This is fishy but good - RT in step 3 would be as a token
exchange request so semantics are different from normal RT
request/response.
Justin: that gives a cleaner place for the semantics, thanks

Arndt: there will be many was to get what we want, complexity results,
can we just make RT the goto method, wil be more clear
Aaron: confirming you want RT to be the main mechanism
Arndt: yes

Atul: arrows 1&2 are for ID Token, 3&4 are for JAG - are they supposed
to be the same AS?
Aaron: that is core to the model (security) - that is the restriction
that this draft adds, if you are talking about different relationships,
Identity Chaining draft might be better
Atul: what are you trying to solve in Enterprise Use Case?
Aaron: the thing that issues the IDtoken becomes the thing that is
issuing for API access across domains

Vanshaj: If I am the client and I make an oauth request, how does
redirect happen?
Aaron: it does not redirect, will do instead of a redirect proactively

Mohibul: what breaks today if we would like to use normal token
exchange? why do we need this on top?
Aaron: the quick answer: the token in token exchange issued by IDP but
you could have case where Resource server accepts, but no scenario where
no resource server will accept tokens issued by the other IDP. Lets RS
use their access tokens in their domain in response to something that
happened in another domain.

PoP Binding

proposal for adding dpop to everything, mostly existing building blocks,
will talk about new thing on friday

multi-tenancy

need a way to point to which install of a given app we're talking about
within the flow

Updates to Audience Values for OAuth 2.0 Authorization Servers - Brian (10 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-rfc7523bis/

Rifaat: anyone against WGLC? (crickets)
Hannes: yes, put it forward

OAuth 2.1 - Aaron (15 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-v2-1/

Colliding URI Query Parameters (#171)

Suggestion: forbid any registered query parameter names
Filip: no concerns, this is still a valid url,
Justin: makes sense, debatable if it is a MUST or SHOULD, if a client
steps into this space they must be expected to be able to handle it. The
behavior of multiple params of th esmae name could be interprested in
many ways, and could be handled by any part of your processing stack. We
encountered - solution was to say if you do this, you are on your own.
For anyone who needs Anchors for where this language is defined; if you
need them ping him
Aaron: So call this out as client's responsibility
Justin: yes, not a normative change but also not particularly present in
the wild

Invalid client and HTTPAuth (#162)

Filip: if the MAY is not present, everyone who returns 401 today would
not be compliant, fallback is 400.
Aaron: can we leave the rest of the 401 but get rid of it for AuthN
schemes? If so would that be acceptable?
Justin: I think that we can because it is the interpretation of the
error msg that we are trying to narrow down.
Aaron: Additionl methodsare in WWW-Authenticate response
Filip: but private_key_jwt is not listed
Justin: can we ignore?
Aaron: want to but need a path to return the 401 part of error but
remove the Auth method challenge bits
Filip: WWW-Authenticate needs a scheme
Aaron: we are stuck
Jeff: can we do an addendum to define an auth method for private key
jwt?
Aaron: Yes but nobody uses it anyway.
Brian: the Auth scheme meant to be a challenge/response, there is an
impedance mismatch. Mutual TLS would be another one you could fail but
you are required to have 401 in WWW-authenticate. Basic is the only one,
could you just say that without getting into supported schemes?
Aaron: seems the sense is we don't want to make current servers
non-compliant but we also don't want to define this mechanism, need to
find a way to slice this
Arndt: maybe just be pragmatic and put our dilemma into the spec for
consideration

Version Upgrade Support / signaling

Aaron: long discussion is on list with no conclusion. How to support 2.0
and 2.1 with opt-in to new behavior wihtout breaking old behavior is not
conclusive.

Filip: you can have a client with 2.0, 2.1 don't need any
discoverability (will be taken offline)

Browser-swapping attacks - Jonas (20 min)

https://openid.net/specs/fapi-security-profile-2_0-final.html#name-browser-swapping-attacks

Filip: a cient will usually be written with response mode in mind, if it
expects a param it won't expect form post etc
Jonas: Method not implemented error as a query parameter won't be
handled,attacker can still then take the parameter and go elsewhere

Aaron: this is deep, and important - agree this is a real attack
scenario. Don't think it is realistic to deprecate, especially since
other response modes are OIDC specified not OAuth-specified. Third reco
could be worth an extension, probably too new for Oauth 2.1. Effort to
fix has relatively low value compared to bearer token theft, as well as
OAuth phishing (protocol works but user is tricked). Those feel higher
priority. Want to minimize churn
Filip: For point #2 in FAPI 2 message signing spec we introduced a plan
to do this, the client is required to use a specific response mode,
cannot be downgraded. Fapi 2.0 has defined a model that uses standard
query response mode & PKCE. Does that spec not cover it?
Jonas: My impression is standard expectation is to keep code secret, you
are right
Justin: Agree 100% with suggestions, these suggestions help prevent
leakage not mitigate. We should be focusing on mitigation, close one
leak another opens. Good security advice exists for sanitizing
parameters on each page before serving to user. (Implicit flow with a
backend)
Rifaat: do we need an interim to hash this out?
Aaron: enough concrete proposals to go ahead with text. Let's start
there first.

Application-Agnostic Demonstration Proof of Possession (DPoP) Framework - Suhas/Cullen (15 min)

https://datatracker.ietf.org/doc/draft-nandakumar-oauth-dpop-proof/

Justin: clarification: is request for adoption in OAuth WG or in MOQ
community/
Suhas: right now the doc adoption is hoped for here, so that more
experts can see
Justin: right now DPoP already doesn't cover much of HTTP, this may not
be a perfectly clean mapping unless you are also hopping to extend for
HTTPS as well - goal or non-goal
Suhas: not sure, right now we are just defining for MOQ but if people
want to have that conversation it can be had
Brian: offhand, it may be more appropriate in MOQ - the DPOP/HTTP
binding was intentional, wonder if it is better not to try to be
transport agnostic (and then adding MOQ). We tried this and had a tough
time, could be more work this way. Consider getting away with using just
audience rather than full context binding. (justin +1 off-mic)
Suhas: we tried but it felt like more of a hack. Can be more
MOQ-specific but other protocol owners wanted to support things other
than MOQ as well - we are open though
Yaroslav: generalizing DPoP is a good direction, there are other places
where it could help (see Friday presentation). Maybe bring to DISPATCH
and see if there is more guidance
Cullen: My take was the only WG chartered to make DPoP changes was this
one. We could do it in MOQ but it isn't chartered for that. DISPATCH
remains good advice
Hannes: we have had efforts with other WGs eg: ACE. There is history but
both groups need to work together no matter where the work happens. Will
discuss with AD and WG chairs
Aaron: this is recurring theme - not clear where that work should
happen, not necessarily good for it to be good to happen outside of
OAuth WG
Rifaat: yes is early days (way too early to adopt doc) we will think
more

Delegated Authorization - Ruochen (5 min)

https://datatracker.ietf.org/doc/draft-li-oauth-delegated-authorization/

Aaron: Don't fully understand, but I see similarities with Identity
Assertion Grant, I will talk again on Friday. Can you read that draft
and see if it works, and say what is missing otherwise?
Ruochen: I will write something about similarities with different works.

Peter Liu: this has a slight advantage, you RS might be in your local
domain. When you exchange with the full key present, you don't need a
roundtrip ... can validate signature at the RS.

Friday 11/7/2025

Chairs update – 5 min

Attestation-based Client Authentication - Paul (20 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-attestation-based-client-auth/

Comments:
Aaron P: may be unpopular opinion: if you look at direction this is
going, feels like client ID references family rather than individual,
other things like DPoP key can indicate individual. CIMD is like that.
Justin also submitted a draft to add the concept of client instances
into OAuth. Aaron also has a proposal but Justin's may be a better
direction.
Paul: should we make it explicit in our draft?
Aaron:

Rifaat: is that captured anywhere that we expect client ID to be a
family
Aaron: I don't know if that is written anywhere
Rifaat: should that be in OAuth 2.1?
Aaron: will go look
Brian: last time I read this draft I thought this was well written and
solved. Aaron is right, this draft is not the right place to fix the
instance/class problem, it is too narrow a scope
Filip S: I agree the draft is clear today, I don't think we need to make
it more explicit. Would not appreciate it if htere was language that
could exclude the option to use client id as one option or the other.
Filip S: in the last slide (issue #1) when it comes to using resources,
a number of things would change, including target audience.
Paul: would you be in favor?
Filip: yes
Arndt: Glad you brought this up (client id issue) I will be bringing up
a draft later, we have the same problem. Think we as a working group
should work on this problem somewhere.
Jeff L: don't define here, this is for client auth so finalize that, if
you need another extension just do an additional draft to add on the
side (issue #1). We have issue #2's problem in WIMSE too
Atul T: I think this spec can be neutral as to instance vs. class,
Wondering if CIMD would allow instances for client IDs.
(many people nod "No")
Mike J: We have been talking about this at least since we made DCR. We
explicitly took the position that we are not going to take a position.
That has been the position ever since.
Justin R: yes we said that back then but the world has changed. The
reality is that most often client id is a class but DCR is explicitly
instances. I also put forward a draft to say that with PAR you don't
need a client ID.

Issue #3: Client Attestation with DPoP

Arndt: why would it be necessary to do both?
Paul: You could use client attestion without DpoP but not the other way.

Paul: if the key is in a remote HSM it gets expensive to do both

Client ID Metadata Document - Aaron (15 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/

Justin: we have implemented - users were surprised by it, support
investigating

Bryan N: no concerns, we implemented at Bluesky, has been working well.
Have hundreds of unique client IDs
Max G: also have implemented, we like it, running into trouble with
preview environments, this has a unique domain now and as a result a
unique client id
Emilia: in the previous meeting we had text about ... (sorry the scribe
did not understand hopefully somebody can put the right description in)

DPoP for the Device Authorization Grant and JWT Authorization Grant - Aaron (15 min)

https://datatracker.ietf.org/doc/draft-parecki-oauth-dpop-device-flow/
https://datatracker.ietf.org/doc/draft-parecki-oauth-jwt-dpop-grant/

Filip: nothing prevents existing AS's from already doing this but
because it wasn't written down, some AS's took different routes. If we
are writing things down, options from already existing deployments
shouyld be added
Aaron: Not a fan of optionality
Brian: There is already a request parameter, PAR is a passthrough of the
request parameters, the conceptual jump to adding here could be a
too-large jump.
Brian: it's already there, if we document it and it does nothing, it's
weird. Either acknowledge or don't, fine either way
Aaron: this is not an adopted draft. First question may be, should this
be adopted

Yaron: we support this draft, have a slightly different use case - want
to bind a bearer token issued by a dufferent service, this draft helps
Filip: JWT bearer grant includes token type that is unfortunate. If we
add another type of binding we need another authz grant. If I'm getting
the JWT from a place I don't know I don't know if it is bound with DPoP
or not, don't know if I should use jwt-bearer or jwt-dpop. in identity
chaining you don't know which grant type was used, or if the token has
been bound.
Aaron: ack
Arndt: situation: what if one domain supports DPoP the other doesn't? If
that AS doesn't know it will just issue a JWT, this represents a
downgrade attack
Jeff: on Monday ID-JAG was exchabnge of ID token for access token (maybe
with RT in the middle) what part of that was Atul's question?
Aaron: Atul's q was at the end. Audience of ID token is IDP, don't want
IDT to be sent to other things but AT can be audienced to other things,
so that might mean ID-JAG works
Justin: I disagree with Filip, devils in details
Aaron: much discussion spurred, we need to talk more on the list

Browserless app2app - Yaron Zehavi (15 min)

https://datatracker.ietf.org/doc/draft-zehavi-oauth-app2app-browserless/

Roberta: I had a few issues with native apps have you seen the
sandboxing side of native browser usage? Could there be a collaboration
there?
Yaron: are you talking about not providing the wrong client the
information? Yes, there is consideration about not rendering in a web
view, only caveat is in use cases where input is needed to guide. We are
restricted to very non-sensitive input.
Aaron: have you seen the 3rd party apps draft, is that a similar thing?
Recognize it doesn't define everything you have but it was intended to
be a framework, didn't it work?
Yaron: we looked at it but the domains involved are totally different,
the issue is the indirect relationships between apps on left & right of
the swimlane. These are not challenges we want to serve.
Aaron: I will take a look, one of the challenges for that draft is that
it is designed to directly present challenges, broader pattern is also
stuff that can be done with the draft, coudl deploy without using
sensitive challenges.
Yaron: happy to talk
Paul: in OpenID4vci had a similar trajectory but also decided the 1st
party apps draft did not fit.
Leif: for discovery flows you may want to look at the seamlessaccess
project it is SAML but there is a lot of learnings there

https://datatracker.ietf.org/doc/draft-watson-oauth-refresh-token-expiration/

George: feels like authorization_expires_in is a one-to-many
relationship, you would need to bind to which authorization expires when

Nick: yes, in some deployments four scopes could be authorized for
different times, that could get out of control quickly. Could add
language to advise implementers what to do (ie returning min value)
Aaron: great changes, like the concept. let's do an adoption call
Justin: simple on the surface but points a bright light at lifetime
relationship between all artifacts (grant management api was a noble
swing). This spirals out quickly beyond 'when is my RT going to expire'.
Usually OAuth tokens are not smart. They use stuff until they stop
working and then reset. Is there a need for additional stuff?
Nick: I expect if this is implemented, 90% wouldn't do anything with it,
big partners though.., Google is limiting access to email to certain
times, that is some of the use case, don't want to overcomplicate. Open
to a per-scope authorization, but seems better to pick a sane default
Justin: viable if there is clear guidance
Paul: RT expiration is a valid scenario that is useful to communicate to
users. Don't understand why there is 2 different things or why RT times
out instead of expiring
Nick: difference is who is responsible. RT timeout is AS policy, other
timeout is user/policy.
Aaron: very important and good design feature of OAuth that clients are
"stupid". Don't want to boil the oceanm, what you have done with the
minimal definitions does let the client stay dumb and I don't want to go
farther than that. This is a good level to shoot for, recommend do not
complicate the draft further
Arndt: I support this work and +1 to Aaron
Bryan: one motivating use case - clients only talking to a couple
providers, your software may talk to wildly different AS's with
different token lifetimes. If you know you want to take an action in a
week it is good to know that the RT won't last that long
Rifaat: can we get a few reviewers?
Brian: I did review, you clarified a lot of what I was worried about in
the previous draft
Rifaat: Justin you had reservations before, would you be opposedto
asking for adoption?
Justin: if this is scoped and simple it can make sense. There is a
deeper discussion to be had, this draft needs to be eyes open, that can
happen post-adoption. If it doesn't spiral it could be a reasonable
addition
Rifaat: getting ense of room, will be official ask on the mailing list.

(nobody jumped up to argue)

Separating DPoP Bindings for Access and Refresh Tokens - Yaroslav (15 min)

https://datatracker.ietf.org/doc/draft-rosomakho-oauth-dpop-rt/

Arndt: to get AT you have to have access to both RT and AT, doesn't mean
at least one workload has to see both?
Yaroslav: yes, but how that is done is implementation detail
Arndt: agree - as long as this is optional I am for this
Brian: we talked a bit, the original DPoP was intentional about not
doing this to reduce complexity. Caveat was, in confidential client use
cases, the key is bound to the confidential client. It is designed to
bind RT to client with access to TPM or HSM. The case where you only get
one thing bound is public client, argument for more flexibility is fair,
but this is different than the use case you discuss. Worry about
introducting complexity in a use case I am not convinced is not
addressed already
Yaroslav: clear - in practice "sender constraints" are the constraints
for all artifacts - if credential is compromised it is compromised for
all. public client is unfortunately more common. Confidential is lower
potential level that you can fall, DPoP gives certain guarantees
Brian: there are public client drafts that could be used instead
Joseph: (no audio boo)
Loren: the alternatives all seem to be backed by PKI, which seems a bit
slower
Brian: there is one variant based on PKI, should step back to look at
existing alternatives

Joseph (from chat): When I first saw the slides (which have since changed) I was going to say something like Brian said, but I think they did a good job of explaining that there can be use for this
I was concerned about introducing multiple dpop nonces, it's a lot
of annoyance and I don't see why a single nonce isn't good enough to
get freshness.

OAuth SPIFFE Client Authentication - Arndt (10 min)

https://datatracker.ietf.org/doc/draft-schwenkschuster-oauth-spiffe-client-auth/

Flemming: I like work, makes sense, infra already does cred mgmt, would
like to take advantage. Want more security consideratings for SVIDs,
alluded to Wimse identity tokens would like to see that too
Arndt: we have a chicken/egg problem with wimse identity tokens
Jeff: I support, we will be doing things. Adding more high assurance
mechanisms is better
Justin: this makes as much sense as everything else. I worry that we are
cramming many things with different semantics into client id, we will
need to be very clear about how we differentiate. This may step on CIMD,
but we can work on that. Seconding question about WIPs etc - better to
not just be SPIFFE if that makes sense. Will you take dependency on
WIMSE?
Arndt: I had it in but took it out
Brian: don't think this is about putting things into client id, but
about how to associate them. We have had convos about tangental OAuth
stuff, this is probably the right place, compared to DPoP Moq stuff
where that seems to be happening outside
Pieter: wrt clientid metadata, there is an opportunity to get the
discovery elegance and combine it.
Rifaat: get the feeling there is interest, any issues with calling for
adoption - nobody in queue

Transaction Tokens - Atul (10 min)

https://datatracker.ietf.org/doc/draft-ietf-oauth-transaction-tokens/

Arndt: not a fan of the replacement process, would question if it would
be better to move it to a separate draft after implementations exist
George: useful feedback, no strong feeling
Pieter: can remove, people will probably do it anyway without guidance
Atul: I like the idea of guidance in a different draft
RECORD SHOWS THAT PIETER SHRUGGED
Justin: this might be semantics. Really creating a new tx token in the
context of a tx token. Reason most likely is to get a new view, but as
token exchange does, add considerations for creating a new one in
context of original one, this isn't really a new thing just guidance
Pieter: this could just be security considerations. Justin's point about
introducting a semantic
RECORD SHOWS THAT BRIAN AGREED
Peter: Can you give more specific example of what specific situation
results in context modified
Atul: if a fraud service does a thing and adds more stuff
Peter: there could be a context rot problem
Rifaat: will take to the list
Pieter: maybe when it is appropriate could also be added to security
considerations
Jeff: there is a force for the replacement which is crossing security
domains
Atul: that is not what we intend
Rifaat: will take to list
Jeff: was discussion what the BFF should do to with the backend resource

Mike: there is a JWT BCP RFC 8725 listing things that people could do
wront with JWT, people did more stuff wrong, we did a BIS version, have
updated draft, have now explained all the additional things wrong, ready
for WGLC. Slides are in the agenda. Want to see this proceed.
Reviewers? None because it published 2 hours ago
Arndt, Filip are reviewers (Filip already did it)
Brian: WGLC after no action from not addressing previous comments might
be premature
Mike: please send items to list