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
https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/
Two drafts since Madrid (-11, -12)
status claimx5c header now required in protected header very clearlyEU is interested in relying on this doc, stable versions are
important
Brian believes this doc is ready for WGLC consideration
Hannes: Who has read the most recent version? (lots of changes, is this
a rewrite?)
https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/
When apps want to talk to each other eg, wiki embedding something
prettier than a long URL (or AI for example)
Goal is to extend SSO to API access between apps
Moves control inside the enterprise IdP
Changes (-01)
Changes for the next version (-02)
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.
proposal for adding dpop to everything, mostly existing building blocks,
will talk about new thing on friday
need a way to point to which install of a given app we're talking about
within the flow
https://datatracker.ietf.org/doc/draft-ietf-oauth-rfc7523bis/
analysis of OID Fed
Filip working on updates to the document that closes the gap from
what was discussed in Dublin
targeted set of fixes that break fewer things
Drafts since Madrid (-03)
Is it time to consider WGLC? Brian says yes
Rifaat: anyone against WGLC? (crickets)
Hannes: yes, put it forward
https://datatracker.ietf.org/doc/draft-ietf-oauth-v2-1/
This doc becomes a new baseline.
Need to push to finish
In Draft (-12)
Many open issues on github, many have discussions, some just need to
get worked up but have a conclusion
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
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
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)
https://openid.net/specs/fapi-security-profile-2_0-final.html#name-browser-swapping-attacks
while doing pen tests on OAuth, realized we need to talk about
browser swapping attacks
CSRF attack is possible if authorization response is injected during
authz code flow, attacker is then logged in as user
state parameter in the authorizationQuestion, what happens with the authorization code? It remains valid
and can be used (potentially by an attacker that finds it)
AuthZ code can be leaked in many ways
doesn't PKCE solve it?
challenge method can be defined by attacker (and comes from session
of attacker)
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
Recommend to circumvent: way for client to invalidate authz codes
(eg CSRF detected). authz code would be unusable that way
For OAuth 2.1: do we still need response_mode=query?
Jonas: the other options seem to work well, response_mode query is
just legacy, should not deprecate but we should say it is mandatory
for AS to provide client implementers the opportunity to enforce a
specific response mode.
We should also include how to invalidate an authz code
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.
https://datatracker.ietf.org/doc/draft-nandakumar-oauth-dpop-proof/
Approach #1 HTTP verbs mapped to MOQ (but isn't easy)
Approach #2: adding generic authorization context object that
contains a type to identify a transport
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
https://datatracker.ietf.org/doc/draft-li-oauth-delegated-authorization/
This framework defines a dt (delegation token) that can be retrieved
instead of an AT
digital sig linked token chain is used. Only delegated AT (DAT) is
accepted by RS, DT alone is not accepted
need a new header (delegated authz header)
Also has a metadata discovery claim
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.
https://datatracker.ietf.org/doc/draft-ietf-oauth-attestation-based-client-auth/
Issue 1: Using the draft outside client authentication
Issue 2: Client ID - matches instance or class?
Does it make more sense to make Client ID individual or keep it
as a class?
Could bind to public key if using individual client instance
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
https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/
Clients publish their own metadata at a URL which becomes their
client ID in a metadata request
good feedback in the adoption process
Context for use cases:
Feedback received: (see slides)
Justin: we have implemented - users were surprised by it, support
investigating
New Client ID URL recognition
Planned updates
SSRF mitigations
Restrict URI properties to HTTPS
security considerations for changes
Prohibit following redirects when fetching
Other issues on github
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)
https://datatracker.ietf.org/doc/draft-parecki-oauth-dpop-device-flow/
https://datatracker.ietf.org/doc/draft-parecki-oauth-jwt-dpop-grant/
Clients using device code grant are likely public clients
DPoP alone doesn't solve that but combining DPoP with app
attestation, a dent can be made
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
DPoP for JWT authZ grant - another document
Aaron cares because of identity chaining
Atul asked: does IDP have to also be the issuer of the ID-JAG?
Lets us differentiate between who does login and who guarantees
token exchange
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
https://datatracker.ietf.org/doc/draft-zehavi-oauth-app2app-browserless/
Challenge: 2020 app2app draft written
In a federation use case some AS's need to use a sub-optimal flow
(more friction)
Client app acts as its own user agent
Accepts a native_callback_uri (pre-registered)
Might say it needs more routing info
client traverses responses until it has enough data
One problem was how to bind to a user agent (thanks George Fletcher)
PKCE recommended, made it mandatory
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/
RT expiration
Since Madrid
more considerations for client behavior
two new token endpoint response params
Looking for reviewers
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)
https://datatracker.ietf.org/doc/draft-rosomakho-oauth-dpop-rt/
designed to solve a practical security problem
Trying to find a way to contain leaked refresh tokens and still able
to run efficiently at scale
Proposal
Outcome: edge workloads only has AT DPoP, core workloads have RT
DPoP
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
https://datatracker.ietf.org/doc/draft-schwenkschuster-oauth-spiffe-client-auth/
Want to put it together to profile the pattern
Had an interim after IETF 123, we are one year in,
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
https://datatracker.ietf.org/doc/draft-ietf-oauth-transaction-tokens/
progress since 123:
open issues
should request context be validated?
concerns over TraT should be replaced
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