<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">I strongly disagree with you based on the feedback I got on earlier drafts that I circulated, and your arguments are not convincing me otherwise.<br><br>The tenant and audit functionality was not in the earliest drafts. I added the tenant and audit functionality based on feedback from early reviews.<br><br><b>tenant</b></div><div dir="ltr"><br></div><div dir="ltr">While not standardized in OpenID Connect, the tenant concept is captured in Microsoft and Google ID Tokens. OpenID has had many years to work on standardizing the tenant claim, but has not, and we now have a world of bespoke tenant claims. Given that some OPs will require RPs to understand tenants, I view the tenant claim as a requirement for OP Commands. Additionally, the concept of a tenant needs to be a first class concept for all the commands as it provides a context within an issuer. If an OpenID Connect Core 1.1 comes along, then it can add it as a claim in the ID Token, but let's help interoperability for OP Commands by embracing the tenant concept as a first class concept and not try tacking it on later. </div><div dir="ltr"><br></div><div><b>audit</b> </div><div><br></div><div>While not all RPs will need to support audit some will for either brown field, or to ensure the OP and RP are in sync. How to sync was a common question on the first draft, and I consider it a required feature in OP Commands for many RPs to adopt. RPs that don't need it can ignore that section, just as they do with many other specs. Those that do are not forced to go look at a different document.</div><div><br></div><div>Similarly, many clients do not need refresh tokens in OAuth 2.0. It was a concept that did not exist in OAuth 1.0, but it enabled long lived authorization for those that needed it. While refresh tokens could have been a different spec, that would have added complexity and confusion. Separating OAuth 2.0 into what became RFC 6749 and RFC 6750 was a mistake driven by Erin, that I regret not taking the time to reverse before publication. We are fixing that in OAuth 2.1, which also incorporates a number of other drafts that were created after 2.0. </div><div><br></div><div><b>SSE</b></div><div><br></div><div>Audit requires sending a large amount of data from the RP to the OP when the number of users scales. Sending that as a single response to a request becomes impractical at some point. SCIM solved it with pagination, and I would argue as an afterthought when someone realized that sending a single response would be impractical. Pagination is hard to implement at scale because you have to maintain the state of what you have sent so far across sessions. </div><div><br></div><div>While SSE may not be what we land on for audit, I think it is much simpler for an RP to implement than pagination. The RP can get the data however it wants and start writing it to the stream. Session disconnections are handled by the libraries transparently at both the server and client. </div><div><br></div><div>I don't expect anyone to be sold yet on SSE being the right choice, but having it in the document gives us something to discuss, and makes it clear that there are challenges with pagination.</div><div><br></div><div>/Dick</div><div dir="ltr"><br></div><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 21, 2025 at 11:50 PM Aaron Parecki <<a href="mailto:aaron@parecki.com" target="_blank">aaron@parecki.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Thanks for the detailed response, this context is helpful.<div><br></div><div>I think the fact that you're able to say this much about the tenant concept and SSE in this reply speaks a great deal to how these are relatively complex topics that warrant their own discussion. I'm not comfortable adopting this draft wholesale, because I don't think this draft is necessarily the right layer to introduce these concepts to OpenID Connect.</div><div><br></div><div>The tenant problem is a great example as you mentioned, since Google and Microsoft both have different ways they handle the tenant concept. This should ultimately be standardized in OpenID Connect Core so that there is a standard way to include the tenant in ID tokens regardless of whether the OP is using OP Commands.</div><div><br></div><div>I am still not convinced that SSE is actually an easier alternative to pagination compared to what is being done in SCIM. I suspect there are also plenty of edge/error cases that will come up with SSE as a syncing mechanism that will require their own creative solutions down the road. Yes there are currently server-side client libraries of SSE, but they are not necessarily being used for data synchronization the way SSE is applied here. Plus, as you mentioned, SSE is used for the tenant audit which is for brownfield implementations, so it's entirely possible an implementation would never need to build this, which suggests this would be better as a separate draft as well.</div><div><br></div><div>Yes, having separate drafts can make things more complex for readers in the short term. But OAuth 2.1 brings together a carefully selected set of drafts from the past 12 years of OAuth. If OAuth had been created all as a massive single draft at the beginning, it would be even more of a mess than it is today. So I don't think putting these three new concepts into a single new OpenID draft is a good path forward.</div><div><br></div><div>Aaron</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 21, 2025 at 1:14 PM Dick Hardt <<a href="mailto:dick.hardt@gmail.com" target="_blank">dick.hardt@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hey Aaron, thanks for the feedback. </div><div><br></div><div>I think these are important points to discuss, but that I would prefer to have the discussion once the WG has decided to adopt the draft so that we can capture all the discussion in the repo rather than this list so that it is easier for others to find the discussion.<br><br>With that being said, and knowing that I will need to copy this content into the repo later on, here is why I think we want to keep tenant and SSE concepts in the draft:<br><br></div><b>tenant</b><div><br>The tenant concept is threaded through all of the draft, not just the tenant commands. The "tenant" claim is required in all of the commands. </div><div>While the tenant concept has not been standardized in OpenID, Google includes a tenant claim "hd" in Google Workspace ID Tokens, and Microsoft includes "tid" in their ID Tokens. Microsoft has a unique issuer for each tenant, but Google does not. In order for Google to adopt OP Commands, we need to provide a standard tenant mechanism, otherwise they will need to add a non-standard claim to their commands to communicate with the tenant. I would like to keep the barrier to adoption by Google as low as possible, and for RP libraries not to have custom code to support Google.<br></div><div><br></div><div>The tenant commands include the tenant_metadata, the only command that an RP MUST implement. The tenant_audit command is needed for brown field adoption for the RP to add OP Commands, and an OP to understand the current state. IE, the OP needs it to get the starting state when OP Commands are enabled. A brand new RP could decide to not support tenant_audit for simplicity, but not having tenant_audit would be a barrier for adoption for some existing RP / OP deployments.<br><br>The other commands are tenant wide versions of the other commands. An RP can choose to not support them. I did notice in the OpenID Slack wg-sharedsignals that someone wanted to know how to send a signal for a tenant, and it was suggested the set the subject to:</div><div> <br></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><div><div>{</div></div></div></div><div><div><div><div>  "format": "complex",</div></div></div></div><div><div><div><div>  "tenant": "tenant-whose-users-were-revoked"</div></div></div></div><div><div><div><div>}</div></div></div></div></blockquote><div dir="ltr"><div dir="ltr"><div><br></div><div>I agree that the tenant claim is not OP Commands specific, and that it may make sense to have a separate document for it, and If the WG wants to specify the tenant claim as a separate document, I'm fine with that, but I strongly believe the tenant claim needs to be used in OP Commands, and so we should adopt the document as is and then we can decide if we want to separate them out or not, as the tenant claim doc would need to exist for it to be used by OP Commands. <br><br>Per the motivation to create OAuth 2.1, I also think having a large number of documents makes it harder for people to grasp everything, so I would argue that perhaps OP Commands introduces the tenant claim and gets it registered in IANA. Note that OP Commands is also defining the group claim, which is currently underspecified.</div><div><b><br></b></div><div><b>SSE</b></div><div><b><br></b></div><div>You are correct that using SSE between servers is a non-traditional use of SSE, and that client libraries are not as abundant as server libraries for SSE. The fact that there are client libraries indicates that there are server implementations. Also it is the OP that is the client here, which is the party where we want to push complexity, and server libraries are readily available for an RP to use. </div><div><br></div><div>I think it adds complexity long term to have more than one way for the RP to send a response, and given that SSE is pretty straightforward and addresses one of the complexity challenges in SCIM (pagination) we should keep it in the draft so that we are forced to address how the RP will send a large response back to the OP in an audit. While we might not decide on SSE -- we don't want to punt on a mechanism for working at scale. <br><br>From an implementation point of view, simple, new RPs don't need SSE if they don't need to support any tenant commands other than tenant_metadata, which is required. </div><div><br></div><div>/Dick</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 21, 2025 at 4:56 PM Aaron Parecki via Openid-specs-ab <<a href="mailto:openid-specs-ab@lists.openid.net" target="_blank">openid-specs-ab@lists.openid.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I took another look at the draft after the discussion on the last call, and I have concerns about the current state of the document and think it should be revised before adopting it. I realize changes are possible after adoption, but I believe the scope of the current document is too broad, and should be narrowed before adoption.<div><br></div><div>In general I am supportive of a lighter weight way to achieve most of what is described in this draft. I like that the command tokens leverage the existing signing key that RPs already use to validate ID tokens. The account lifecycle commands are well thought out and I appreciate the state transition diagram in the draft.</div><div><br></div><div>However, I have concerns about the Tenant commands as well as the use of Server-Sent Events.</div><div><br></div><div>The Tenant commands bring in a new concept that does not exist elsewhere in OpenID Connect today. I understand the goal here, but I am not convinced this draft is the right place to introduce this concept. This would be better off as a separate OpenID Connect extension that extends both OpenID Connect Core and OP Commands to add the Tenant concept.</div><div><br></div><div>The use of Server-Sent Events is somewhat unusual here. It technically works, but the API is actually defined in HTML as an API to allow a web server to stream content to a web browser. I am personally a huge fan of SSE as it's easier to deploy in web servers compared to Websockets. Using it for server-to-server communications is a somewhat non-traditional application of the technology. While it would work, I am concerned that it is not the best tool for the job, since there are far fewer server-side SSE client libraries since most of the use is where the client is the web browser. That said, I am not entirely opposed to using it this way, I just worry that bringing it in to the OP Commands draft this early might backfire on the other more easily understood patterns in the draft.</div><div><br></div><div>This is all to say that I would support adopting a version of this draft that describes only the account lifecycle commands with HTTP delivery as described in the first half of the document, and remove the Tenant commands and SSE delivery mechanisms.</div><div><br></div><div>Aaron</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 20, 2025 at 1:18 PM Michael Jones via Openid-specs-ab <<a href="mailto:openid-specs-ab@lists.openid.net" target="_blank">openid-specs-ab@lists.openid.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>





<div lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:11pt">This starts a two-week call for feedback on whether to adopt the OpenID Provider Commands specification contributed to the working group by Dick Hardt and Karl McGuiness as an OpenID Connect Working Group
 specification.  Please reply-all by Thursday, March 6<sup>th</sup> saying whether you are favor of adoption or not, briefly also saying why.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt">You can read more about the decision made on today’s working group call to start a call for adoption in the
<a href="https://lists.openid.net/pipermail/openid-specs-ab/2025-February/010620.html" target="_blank">
minutes written by John Melati</a>.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt">                                                Writing as a working group chair,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt">                                                                -- Mike
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11pt;font-family:Calibri,sans-serif">From:</span></b><span style="font-size:11pt;font-family:Calibri,sans-serif"> Dick Hardt <<a href="mailto:dick.hardt@gmail.com" target="_blank">dick.hardt@gmail.com</a>>
<br>
<b>Sent:</b> Wednesday, January 15, 2025 4:30 AM<br>
<b>To:</b> <a href="mailto:openid-specs-ab@lists.openid.net" target="_blank">openid-specs-ab@lists.openid.net</a><br>
<b>Cc:</b> Karl McGuinness <<a href="mailto:me@karlmcguinness.com" target="_blank">me@karlmcguinness.com</a>>; Michael Jones <<a href="mailto:michael_b_jones@hotmail.com" target="_blank">michael_b_jones@hotmail.com</a>>; Nat Sakimura <<a href="mailto:sakimura@gmail.com" target="_blank">sakimura@gmail.com</a>>; John Bradley <<a href="mailto:ve7jtb@ve7jtb.com" target="_blank">ve7jtb@ve7jtb.com</a>><br>
<b>Subject:</b> OpenID Provider Commands - proposed WG specification<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">Hello WG (and chairs)<br>
<br>
Karl (cc'ed) and I have been working on a new protocol that complements OpenID Connect for an OP to centrally manage account lifecycles at RPs. We have also defined an Unauthorize Command which undoes whatever actions an RP did in a previous OpenID Connect
 login -- useful if an OP suspects an account or device had been compromised -- instructs an RP to "kill all the sessions and tokens"<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We contribute the IP in the attached HTML and Markdown files to the OpenID Foundation per the Foundations IPR. <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We have a FAQ as a note at the top, that I am including below for your convenience.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We hope this work is of interest to others in the WG, and that together we can improve the security posture of implementers.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">/Dick & Karl<br>
<br>
<br>
<u></u><u></u></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in">
<strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">1. How does SCIM compare to OpenID Provider (OP) Commands?</span></strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)"><u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.3">
<span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">The SCIM protocol is a general purpose protocol for a client to manage resources at a server. When the SCIM protocol is used between an IdP and an RP, the schema is defined by the
 RP. The resources managed are in the context of the RP Tenant in a multi-tenant RP. Any extensions to the schema are defined by the RP. This provided an interoperable protocol to manage RP resources. OpenID Provider Commands are an extension of a user Account
 created by OpenID Connect. It uses the same identity Claims that the OP issues for the user. It uses the same token Claims, and is verified the same way. OpenID Provider Commands are issued in the context of the OP Tenant in a multi-tenant OP.<u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.4">
<strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">2. How do Shared Signals / RISC compare to OpenID Provider Commands?</span></strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)"><u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.5">
<span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">Shared Signals and RISC are events that one party is sharing with another party. The actions a receiving party takes upon receiving a signal are intentionally not defined. The actions
 taken by the RP when receiving an OpenID Provider Command is specified. This gives an OP control over the Account at the RP.<u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.6">
<strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">3. Are OpenID Provider Commands a replacement for SCIM, Shared Signals, or RISC?</span></strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)"><u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.7">
<span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">No. These standards are deployed by organizations that have complex requirements, and these standards meet there needs. Most OP / RPs do not deploy any of these standards, as the
 implementation complexity is not warranted. OpenID Provider Commands are designed to build on OpenID Connect, allowing RPs using OpenID Connect an easy path to offer OPs a standard API for security and lifecycle operations.<u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.8">
<strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">4. Why are there only groups? Why not roles and entitlements?</span></strong><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)"><u></u><u></u></span></p>
<p style="margin-right:0in;margin-bottom:12pt;margin-left:0in" id="m_9126074971044289233m_-340431066711246023m_-6617812940805398432m_8380237628063331605m_-9121673182393254570m_-7103686937483258216gmail-section-1-1.9">
<span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;color:rgb(17,17,17)">OpenID Provider Commands are used to project the Tenant data managed centrally by the OP. Groups are a common term used by OPs to manage a collection of Accounts. The terms roles
 and entitlements tend to be RP specific. Generally, groups from the OP will be mapped to roles and/or entitlements that are RP specific, at the RP.<u></u><u></u></span></p>
</div>
</div>
</div>
</div>
</div>

_______________________________________________<br>
Openid-specs-ab mailing list<br>
<a href="mailto:Openid-specs-ab@lists.openid.net" target="_blank">Openid-specs-ab@lists.openid.net</a><br>
<a href="https://lists.openid.net/mailman/listinfo/openid-specs-ab" rel="noreferrer" target="_blank">https://lists.openid.net/mailman/listinfo/openid-specs-ab</a><br>
</div></blockquote></div>
_______________________________________________<br>
Openid-specs-ab mailing list<br>
<a href="mailto:Openid-specs-ab@lists.openid.net" target="_blank">Openid-specs-ab@lists.openid.net</a><br>
<a href="https://lists.openid.net/mailman/listinfo/openid-specs-ab" rel="noreferrer" target="_blank">https://lists.openid.net/mailman/listinfo/openid-specs-ab</a><br>
</blockquote></div></div></div>
</div>
</blockquote></div>
</blockquote></div></div>
</div></div></div></div>