07:45:01 RRSAgent has joined #lws 07:45:05 logging to https://www.w3.org/2025/10/09-lws-irc 07:45:05 RRSAgent, make logs Public 07:45:06 please title this meeting ("meeting: ..."), pchampin 07:45:13 bendm has joined #lws 07:45:23 present+ 07:45:24 bartb has joined #lws 07:45:31 Beau has joined #lws 07:45:41 present+ 07:46:03 Wonsuk has joined #lws 07:46:13 Topic: Action items 07:46:55 s/Action items/Agenda 07:47:05 laurens: we will start action items from yesterday, assigning people who want to refine the questions we discussed 07:47:11 ... then discuss Authorization 07:47:23 present+ Wonsuk_Lee 07:47:34 ... In the afternoon, we will discuss authentication, and continue the discussions on core operations 07:47:53 ... then we will set a road map and further discuss action items 07:48:33 Topic: Action items from yesterday 07:48:51 aaron: we discussed a couple of topics, and seem to have general consensus on how to express this in specifications 07:48:54 laurens has joined #Lws 07:49:03 present+ 07:49:17 ... the next step would be to have some text that the whole group could discuss, before merging it 07:49:40 ... we could start with PRs on the spec, or with issues, depending on how complicated the topic is 07:49:54 ... we should have a person responsible to each topic 07:50:01 ... - a section that describes the conceptual entities 07:50:12 ... - a section that starts to unpack the type index 07:50:59 For the type index I believe that definitions need to be clarified, so better start with an issue 07:51:14 s/For the/... for the 07:51:32 ... I can take the first one. I'll probably go with several PR, one for each entity kind 07:51:43 ... I'm not convinced that the names will remain 07:52:00 ... This would provide an outline for the main parts of the specification 07:52:16 laurens: yes, then additional PRs could be proposed on each section 07:52:44 ... I would have a section with conceptual entities and abstract operations 07:52:53 ... then another section with RESTful implementation of these operations 07:53:58 aaron: the HTTP bindings would be in a separate PR (even though HTTP operations can be informally mentioned in the abstract operations) 07:54:30 ben: I expect that discussion on metadata will be more extensive 07:54:34 aaron: I agree 07:55:03 ... a lot of what we have been discussing, especially the linked data features, will be important for the metadata 07:55:13 laurens has joined #lws 07:55:33 ben: we don't need to follow how Dropbox or Google drive are doing things, but it can be a good source of inspiration 07:56:08 ... we should look at existing APIs to decide what we want to take from them as inspiration 07:56:17 ... I can do this research 07:57:08 aaron: Erich Bremer has already written something about metadata, largely based on linksets 07:57:17 ... I expect this to be a big part of the section on metadata 07:57:32 ben: updating metadata can have a number of side effects (like renaming, moving...) 07:57:52 aaron: I'm hoping we can discuss details about metadata before we get into authorization 07:58:04 ... Is anyone interested in taking the lead about the type index? 07:58:13 laurens: I can try that 07:58:54 ... there might be relations to LDES, or even other ontologies 07:59:24 aaron: there was two thing I was hoping to discuss yesterday 07:59:33 ... - the structure and data model of containers 07:59:37 ... - other kinds of metadata 08:00:28 eric: I prefer to start with containers, this would ground our conversation on metadata 08:00:34 sutopic: Containers 08:00:50 aaron: the current spec says the containers are RDF 08:01:00 ... no guidance about JSON representation, about what properties to include 08:01:15 ... no facility for extremely large containers that you might want to page through 08:01:44 ben: another one is the need to list the files without needing access to them 08:02:20 laurens: what's important to me: paginating the "contains" relationships 08:03:02 ... there's the question of what other metadata we want to include 08:03:14 jeswr has joined #lws 08:03:15 ... some metadata are part of system-management 08:03:22 present+ 08:03:40 ben: should it include something like "controller"? 08:04:18 laurens: that's tricky to define. Could be several people? Should this be the owner? 08:04:43 bartb: by owner, do you mean the owner of the whole pod? 08:05:39 laurens: we are veering into the authorization discussion, this is a complicated subject 08:06:23 ... another metadata is type. Should it be system- or user-manage, or both? 08:07:09 aaron: imagine you want to list only the JSON files in a container. With opaque names, you need a HEAD on each resource, not practical. 08:07:39 [aaron writes some JSON-LD on the paper board] 08:08:38 ... without presuming the exact format we will use for containers, we will have a list of "items" 08:08:56 ... each object in this list may contain the id of the resource 08:09:48 ericP has joined #lws 08:09:57 present+ 08:10:00 ... a type, which would be an array containing system defines (e.g. "Container") and user-defined (which may be set via the metadata) 08:10:35 ben: could be multiple, could be 50,000 08:10:50 aaron: could be, though servers could add constraints on this 08:10:58 ... items could have a size value, last-modified, created 08:11:21 ... in principle, any item in the link-set metadata could just be here 08:11:50 laurens: and what would be present could be negociable by the client 08:12:06 aaron: yes, with Prefer: headers. LDP does that, I like it, but I'm not sure how widely this is used. 08:12:43 ben: this would be ACL managed, right? the list is generated based on your permissions? 08:13:28 laurens: it should be. Note that having read access to a container should probably allow you to see what's in it. 08:13:39 aaron: I've worked on 2 LDP servers that did things differently 08:14:12 ... Fedora had an ACL aware container. If you have access to only 1 of the 3 items in a container, the 2 other entries would be there but obfuscated. 08:14:25 ... There is a huge performance penalty for that. 08:15:07 ... The other approach is: if you have read access to the container, you can see all that it contains. 08:15:12 ryey has joined #lws 08:15:15 present 08:15:34 ... If you have privacy concerns, you can use a 2-levels hierarchy. 08:15:58 ben: 2nd option seems reasonable 08:16:11 q+ to geek about the interminable 401/404 debate 08:17:24 rui: could there be a middle-ground, with 2 read permissions for containers? 08:17:36 laurens: I suggest we park this for the Authorization discussion. 08:17:47 ... but this middle-ground already exists. 08:19:02 ... Also, changing the view of the container based on your permissions on the contained resource makes its hard to cache. 08:19:05 q- 08:19:21 ericP: is this the same problem with the type index? 08:20:00 ... if someone makes a resource confidential, it would have an impact on the type index and on the container. 08:20:04 present+ 08:20:11 ... Same caching issues. 08:20:29 laurens: for me the type index is eventually consistent, different from containers. Maybe others have other expectations. 08:20:51 ericP: I guess some people might want to debate that. 08:22:02 ... My point is: we may need to consider the issues on containers and the issues on type index all at once. 08:22:43 ben: you can still use sub-container to hide confidential resources 08:23:07 ericP: this forces people to use a specific organization of their resources 08:23:37 laurens: what is the meaning of the READ permission on a container? 08:23:54 ericP: I would argue that to see an item in the container, you need READ persmission on both the container and the item. 08:24:12 ... I wonder if the performance issues mentioned by Aaron were implementation issues, or deeper. 08:24:54 aaron: back to serialization, I would like to discuss which metadata are part of the container's description 08:25:28 laurens: I would expect a "containedBy" link available on the resource 08:26:43 scribe+ 08:27:10 pchampin: shoud the container include the media type plus the RDF type? 08:27:13 scribe- 08:28:22 ben: I would suggest 3 different properties for different kinds of type: LWS type (container/resource), media type, additional types 08:28:45 rui: how do we get the media type? 08:29:02 aaron: I would expect that the server keeps track of the media type of each resource 08:29:10 ... this is a MUST in the current Solid spec 08:29:56 ben: back to the Prefer: header, this could be used to deal with the scalability when we have a large number of types 08:30:41 aaron: I think this discussion will be informed by the higher level discussion on description format 08:31:05 ... Activity Streams has a notion of Collection, LDP has a notion of container 08:31:33 laurens: I would avoid overloading LDP containers, I suspect we are going to diverge from it 08:31:47 ... but I appreciate the need to be backward compatible 08:32:27 aaron: I expect that we will define a JSON-LD context for LWS, which could include the AS context 08:32:42 ... so we will reuse existing vocabulary when available 08:33:11 ... for last-modified and created, probably Dublin Core 08:33:30 laurens: is there something for size? 08:33:45 jeswr: stat:size is already in the spec 08:33:58 aaron: but stat: is explicitly for POSIX filesystems... talk about overloading 08:34:08 ben: defining our own terms is not that bad 08:35:35 aaron: I would include a size predicate; I would make it a SHOULD because exposing the size of large files could be a security issue (attack target) 08:35:51 ... and only for non-container resources 08:36:00 ... id would be a must 08:36:27 laurens: as well as resource type and media type 08:36:46 s/be a must/be a MUST 08:36:58 ... all the rest would be SHOULD, imo 08:37:32 rui: the size is not the only one that would be security sensitive, names can sometimes be 08:38:00 aaron: that's why I would suggest most metadata would be SHOULD 08:38:15 bartb: also, some resources might be generated, so the size is not known in advance 08:38:31 aaron: that's a good point. We may have a notion of "projected resource", or views. 08:39:55 pchampin: as we are discussing MUSTs and SHOULDs 08:40:16 ... I suggest that we not only make JSON-LD contexts but also JSON-schemas of sorts for the LWS serializations 08:40:29 ... more friendly to developers who are not comfortable with Linked Data 08:41:01 ben: I would also suggest a "label" field 08:41:12 jeswr: why put it here rather than in the metadata resource? 08:42:02 ben: yes, I'm mixing the two, but the metadata in the container are related to the metadata of the data resource 08:42:34 jeswr: I would suggest that the user-defined types are more appropriate for the metadata than for the container medatata 08:43:20 rui: every metadata should be in the metadata associated resource (except maybe size) 08:43:47 ... and in this associated resource, you would specify which would show in the containers 08:44:06 ben: that's what I was suggesting 08:44:50 jeswr: this raises the question of the resource-level metadata that you are authorized to see 08:47:31 pchampin: LWS containers and AS collections are similar, but we need more discussion; they should maybe not be conflated 08:47:42 subtopic: Resource-level metadata 08:47:52 RRSAgent, make minutes 08:47:53 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 08:48:42 aaron: Erich Bremer has written some text, based on RFC 9264 (LinkeSet resources) 08:49:03 ... it follows the RFC 8288 (Web Linking) 08:50:02 ... a link has a target (a URI), a relation type ('rel=...'), and a number of relation types are predefined 08:50:15 ... additionally, a link can have a title (text) 08:51:08 ... you can put an arbitrary URI in the rel= attribute 08:51:32 ... LDP defines its own relation types as URIs 08:52:00 ... this relying on LinkSet puts constraints on what could be in the metadata 08:52:29 ... adding properties to the link is allowed but not recommended 08:52:49 laurens: one problem is that Web Linking only expects URIs as the target of the links 08:53:39 aaron: the title attribute allows for text, title* allows for internationalized text 08:53:56 pchampin: but that's an indirection, that "the title of the target itentified by the URI" 08:54:21 meeting: LWS WG Face-to-Face Meeting (Day 2) – 09 October 2025 08:54:42 laurens: we discussed yesterday about opaque identifiers 08:54:52 ... this would make it important to be able to add user-friendly labels 08:54:56 ... which this method can not capture 08:55:29 ... an RDF document with the resource as primary topic would be more flexible 08:55:46 aaron: the advantage, on the other hand, is the ability to convey the metadata as link headers 08:56:17 laurens: there is also the question of server-managed vs user-managed 08:56:56 ... with RDF, system-managed could be enclosed in a named graph, making things easier for developers 08:57:11 aaron: I get the point about labels and literals 08:57:23 ... about server-managed, I don't think there would be too many of them 08:58:09 ... namely: describes / describedBy, acl (potentially) 08:58:30 ... the current specification has a relation to the root of the storage; that also would be server-managed 08:58:49 ... also a relation pointing to a storage description would be server-managed 08:59:06 ... apart from that, I think everything else is good for users to manipulate 09:00:20 q+ to say that LDP Containers did double duty as server-managed and user-managed containers. if we want to enable both UML:owned members and polyhierarchy, we might want to consider the user-managed containers as their emulations of the server Container interface, but entirely not our problem 09:00:20 pchampin: could we simply add spurious attributs to the LinkSet documents, where we would shove some JSON-LD with literal properties? 09:00:31 aaron: I re-read the spec, they discourage that 09:01:18 ... Note that if you have a binary object that can not self describe and you want a rich set of metadata about it 09:01:42 ... I would encourage that you create a data resource that is RDF, and then you link to that as "additional description" 09:02:20 laurens: that's what I discussed yesterday with additional secondary resource 09:02:54 rui: I'm looking at RFC 9264, we need to serialize this to JSON 09:03:40 aaron: the RFC defines 2 formats, one of them is JSON. We would require the JSON, we would authorize contebnt-negotiation to Turtle 09:03:55 laurens: but updating the resource should use the JSON standard format 09:04:07 aaron: I would not prevent SPARQL update of the resource, but not require it 09:04:47 ericP: you can do a PUT with an etag, the etag depending on the serialization 09:05:42 ben: aren't we painting ourselves in a corner with this serialization? shouldn't we discuss what metadata we need more generally first? 09:06:17 ... the ability to convey the metadata in HTTP Link headers is an optimization 09:07:10 aaron: you are right 09:07:28 ... start with describes / describedBy, linking between a resource and its metadata resource 09:07:45 ... acl 09:07:51 ... parent 09:08:05 rui: is parent an array or a single value? 09:08:56 aaron: type (server defined, e.g. container/resource) 09:09:00 ... media-type 09:09:23 ... label (a.k.a. user defined type) 09:09:57 ... storage 09:10:14 ... storage metadata 09:10:56 laurens: about 'storage metadata', could be discoverable with .well-known (like OpenID) 09:11:15 aaron: as we are doing linked data, I prefer explicit links 09:12:39 laurens: acl would be server managed in most implementations, even though there is a slight chance that some implementations would want to allow users to set it 09:14:15 aaron: I imagine that we can define a number of mandatory fields, users could add their own 09:14:27 laurens: server implementations could also 09:14:34 beau: I suggest adding a link to a shape file 09:14:46 aaron: +1, although I would suggest "schema" 09:15:42 rui: label should be renamed to user-defined-type 09:15:53 ben: but a text label property should be there 09:17:57 Wonsuk: having a version marker would be useful, because the metadata format may evolve 09:18:15 jeswr: could be achieved by a version number in the JSON-LD context 09:19:25 pchampin: I like aaron's suggestion earlier "additional-medatata" (a data resource that further describes the resource) 09:20:31 rui: about 'parent', should the concept of "transitive container" be possible? 09:20:39 jeswr: this has impact on authorization 09:21:14 aaron: if A contains B contains C, the metadata for C would say: "parent=B", it would not talk about A 09:21:50 ... one might allow an alias of a resource to be in multiple containers 09:23:03 aaron: maybe we could have a "hierarchy" field that gives an array of all ancestors, from direct parent to storage root 09:23:13 ... could be useful 09:23:18 ack me 09:23:18 ericP, you wanted to say that LDP Containers did double duty as server-managed and user-managed containers. if we want to enable both UML:owned members and polyhierarchy, we might 09:23:21 ... want to consider the user-managed containers as their emulations of the server Container interface, but entirely not our problem 09:23:32 rui: could be useful, but that's different from my question 09:24:16 ericP: in LDP, contains is server managed (you POST to a container, it contains the resource) 09:24:59 ... we can allow to emulate our container model in userland 09:25:36 ... rather then defining complicated things such as "hierarchies" 09:26:05 s/complicated things such as "hierarchies"/complicated things such as polyhierarchies/ 09:26:17 scribe+ 09:27:29 pchampin: we assume that the server manages the presence in a container but we could decouple that from @@99 09:27:56 scribe- 09:28:09 s/@@99/the side effect that the server *has* to deal with (regarding ACL) 09:28:49 RRSAgent, make minutes 09:28:51 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 09:28:57 present+ 09:29:43 present+ bartb 09:30:03 present+ aaron 09:30:10 RRSAgent, make minutes 09:30:11 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 09:30:28 acoburn has joined #lws 09:30:36 present+ 09:30:41 s/sutopic:/subtopic: 09:30:43 RRSAgent, make minutes 09:30:44 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 09:30:54 s/rui: /ryey: / 09:35:28 acoburn has joined #lws 09:38:50 present- aaron 09:38:52 RRSAgent, make minutes 09:38:54 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 09:39:20 scribe+ bendm 09:39:22 s/rui: /s:ryey: /g 09:39:24 scribe- 09:41:12 acoburn: (writing Authorization Server and Resource Server/AS and RS on the white board) 09:41:32 ... (and Relying Party/RP) 09:42:27 ... I'm not suggesting OAuth2 is the only framework we should use 09:42:34 ... but it gives us an abstract model to think about it 09:42:45 ... so it should at least work with this 09:42:52 i|laurens: we will start|scribe+ pchampin 09:42:54 ... for SAML, the names are different, but the structure is the same 09:43:28 ... at the very least, we need to describe the interface RS/AS and RS/RP 09:43:42 ... question is: to what extent do we describe the other interactions? 09:44:22 bendm: do we expect to support one authz protocol? 09:44:40 acoburn: personal feeling: authz protocols keep changing 09:45:00 ... OAuth2 and SAML are around for a long time, but there's OIDC/GNAP/... thinks keep changing 09:45:27 ... being too rigid would hurt us 09:45:40 laurens: but OAuth2 will probably not go anywhere soon 09:46:27 acoburn: pinning to OAuth2 isn't too bad, but being too open brings complexity 09:47:22 laurens: I've seen OAuth2 in very performant systems, and a lot of caching or optimizations is possible 09:47:30 acoburn: also, this is an abstract model 09:47:42 pchampin: can we go through the responsibilities? 09:47:47 acoburn: generally speaking: 09:47:58 ... simplest case: 09:48:16 ... 1 app (RP), 1 RS, 1 known AS 09:48:49 ... RP: if no token, do request to AS (client credentials, via browser or backend), get token 09:49:46 ... token is sent from RP to RS (JWT or something else), RS validates token (token introspection via roundtrip from AS, or via key material from AS without roundtrip) 09:50:15 ... RP is an application, client,... 09:50:39 ... the thing that is trying to do the GET/... 09:51:07 ... 1st problem: how to find the AS? you go to the RS first 09:51:35 ... you get a 401 with WWW-AUTHENTICATE header that hints to the AS 09:52:15 ... could just be 'Bearer', meaning 'just fetch it at the AS, you know where it is' 09:52:36 ... given we're decentralized, we probably we want 'Bearer; ' 09:52:48 ... we can do this without requiring UMA 09:53:49 ... this is on the HTTP level 09:54:14 ... scheme and series of properties 09:54:22 ... I'm pretty sure GNAP uses the same thing 09:55:03 laurens: yes, there's a convention 09:55:32 acoburn: if it was UMA: it would include a ticket and state 'UMA' instead of 'Bearer' 09:56:02 ... basically what is stated is 'follow the semantic of the scheme that is presented', ie Bearer, UMA, GNAP 09:56:45 ... I don't think we need to specify one 09:57:05 ... but if we must (eg for testing), I would go for OAuth2 09:58:59 ... there might be more steps between RS and AS, eg OIDC provider 09:59:15 laurens: token exchange is a good fit for some problems we might have, RDF8693 09:59:20 https://datatracker.ietf.org/doc/html/rfc8693 09:59:26 ... RFC8693 10:00:15 acoburn: with self-souvereign, the RP merges with _some_ of these intermediate steps between RP and AS 10:00:49 ... so there will always be some kind of distinction between the AS and the RS 10:01:20 ... and always some kind of distinction between RP and RS, even if deployed on the same server 10:02:22 laurens has joined #lws 10:02:57 acoburn: RP could have done some authn beforehand, but that's not necessary 10:03:16 ... an RS could have different authz setups 10:03:45 laurens: Solid uses an OIDC ID token, so it's cleaner to have a distinct authz server 10:03:57 ... also for token lifetimes etc 10:04:10 ryey: so there's no consdering of exposing sensitive info? 10:04:19 acoburn: so far, everything is public 10:04:41 ... any token _should_ be opaque, but it's often a signed JWT etc 10:04:58 ... so what kind of info that goes into that JWT needs to be considered 10:05:37 ... simple model is that we define the RS, and the interaction boundaries between RP and AS, and that's it 10:05:51 ... more complex is that we also include all interactions between RP and AS 10:06:01 ... eg if you do it like X, you must do it like 10:07:24 laurens: I see a lot of complexity when dynamically being able to manage AS 10:08:08 ... AS signifies the protocol, not implies anything about the policies used 10:08:46 ... AS check whether you have the right authn and credentials 10:08:53 bendm: but then who does the authz? 10:09:00 acoburn: there's different models 10:09:28 ... to be defined: the token sent by the AS: how does that look like? 10:10:05 ... first define the data model of that token 10:10:25 laurens: I suggest splitting course-grained authz via the AS with fine-grained authz via the RS 10:10:36 acoburn: model 1: token contains a yes or no 10:11:10 ... model 2: token contains a partial decision, and the RS roundtrips to the AS for the fine-grained decision 10:11:29 ... historically, model 1 was used (eg via scopes) 10:12:05 ... i.e. you have scope read:X, RS says 'write:X is not allowed' 10:12:38 ... justin richter from GNAP has lots of experience why scopes are not sufficient 10:12:49 laurens: currently, scopes are defined by the RS 10:13:06 acoburn: yes, and tend to be very app-specific, thus not interoperable 10:13:29 laurens: so ACL rules with has:scope would be horrible for interop 10:14:05 ... example: you have a public resource 10:14:16 ... you don't get an AS redirect 10:14:47 ... for a private resource: you get a token via AS that _might_ give you access 10:14:59 ... RS is tasked with the decision: can you do XYZ? 10:15:29 ... the RP gets the response of the RS whether the action is succesful 10:16:21 ... part of the decision could be via the AS, but the RS is in control 10:16:29 bendm: that feels like bad separation of concerns? 10:16:43 laurens: let's say you have A and B, you have access to A 10:16:53 acoburn has joined #lws 10:17:11 ... you want A, you go via AS, and get a token for A 10:17:18 ... you cannot reuse that for B 10:18:15 ... also, AS, doesn't know what type of operation you want to perform 10:19:08 bendm: but then, you can't solve that with scopes? 10:20:00 laurens: this has been a long-standing issue, RFC9396 is a solution to that: rich authz request 10:20:47 acoburn: JWT has a couple of claims (headers, sub, iss, and aud) 10:21:04 ... RDF9396 suggests additional claim 'authz details' 10:22:25 ... adds locations/actions/privileges/datatypes 10:22:54 ... this gets sent to the AS to check whether you can do all of this 10:23:03 ... and gets mirrored back to the JWT 10:24:01 bendm: so basically, this is an alternative to more specialized/formalized scopes 10:24:10 laurens: this allows the RS to fully know what to do 10:24:19 ... ie. say yes or no to specific requests 10:26:00 ... you can have an array of authz details 10:27:11 ryey: do you need to specify these datatypes details? 10:27:12 laurens: no 10:28:03 ... for LWS, we could specify for actions the modes we allow in the authorization model 10:28:36 pchampin: so, once authenticated, this can happen under the hood, without me noticing? 10:29:00 acoburn: this is specifically for the RP talking to the RS what they want 10:29:32 pchampin: so, we are constraining the connections between RP and AS? 10:30:05 acoburn: we mostly want to give guidance: RP and AS interactions keep changes 10:30:35 ericP: RP/AS links change more frequently than the other links? 10:30:51 acoburn: historically, RP/RS link is entirely app-defined 10:31:16 ... first step is to create an abstract model for what that looks like 10:31:44 ... to get interop foor OAuth and JWT, wichi is the majority of things that work 10:34:12 bendm: so maybe first next topic is to see how we can align this with current status quo? 11:26:18 gibsonf1 has joined #lws 11:37:07 acoburn has joined #lws 11:44:09 bendm has joined #lws 11:45:55 laurens has joined #lws 11:46:05 rssagent, draft minutes 11:46:05 scribe+ 11:46:15 [we reconvene after lunch] 11:46:25 rrsagent, draft minutes 11:46:27 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html laurens 11:47:12 ryey has joined #lws 11:47:30 acoburn: to recap, the Relying Party (RP) asks for a resource to the Resource Server (RS), and gets a 401 with a link to the Authorisation Server (AS) 11:47:52 ... that requires the RS to be aware of the AS (RS-AS interface in the diagram) 11:48:40 ... another aspect of the RS-AS interface is whether the AS has access to the policies on the RS (the 'acl' resource) 11:48:52 laurens: I think it should have access 11:49:06 acoburn: depends on the path we are taking 11:49:36 ... the policy might be hosted on the AS, or at least in a location that is aware of the AS 11:50:07 laurens: either it is going to be on the RS as a regular RDF resource, or a specific resource managed by the AS 11:50:28 acoburn: ESS does the latter; both models could work, with pros and cons 11:50:38 laurens: I would not mandate one or the other in the spec 11:51:08 ben: I don't think that the RS needs to know what is in the policy 11:51:47 laurens: it does not need it in the model we are discussing; in the current model of Solid, this is different 11:52:09 ... in the current Solid model, the RS makes the final decision about authorization 11:52:38 pchampin: by "current Solid model", you mean... 11:52:47 laurens: ... Solid with Solid OIDC 11:53:38 ... the only thing that the RS has to make the decision is the identity of the user 11:54:07 ... I think we want to cleanup the separation of concerns 11:54:34 ben: with this separation the Policy language is not anymore in scope of the spec 11:54:51 acoburn: this is tricky, because this would kill interop when it comes to manage policies 11:55:31 ... on the other hand, I have low confidence in WAC or ACP being long term solutions for LWS 11:55:54 ... but that's all we have today, so I would like to make do with what we have, but leave the door open for other policy languages in the future 11:56:20 laurens: to play the devil's advocate: we don't need the policy language to be the interface to policy management 11:56:49 ... we could define an interface to request/grant/revoke access 11:57:13 ... it is a big step from the current state 11:57:45 acoburn: this would be a middle ground 11:58:27 ... this amounts to ask "can you answer these questions" (fields in "Authorization details") 11:58:43 RSSAgent, make minutes 11:58:44 wonsuk has joined #lws 11:58:45 laurens: this is a form of discretionary access control 11:59:18 ... role-based access control @@ 11:59:29 ... attribute-based access control is yet something entirely different 11:59:39 s/RSSAgent/RRSAgent/ 12:00:17 ben: WAC maps an identity to the different operations; ACP maps a VC to the different operations 12:00:36 s/@@/would be more general 12:00:51 RRSAgent, make minutues 12:00:51 I'm logging. I don't understand 'make minutues', ryey. Try /msg RRSAgent help 12:01:07 acoburn: in JWT, sub is the agent (as a person) 12:01:20 ... iss is the issuer 12:01:31 ... aud (audience) is your app, the Relying Party 12:01:45 RRSAgent, make minutes 12:01:46 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html ryey 12:01:55 ... actually, there are two ways of defining "audience". It is "the entity to which you are sending the token" 12:02:04 ... different based on your PoV 12:02:51 laurens: I don't think that aud is always the RP in OAuth 12:03:04 acoburn: aud can be a single value or an array 12:03:19 ... if you want it to be the RP and the RS, you would put both 12:03:40 ... there is also "authorized party" (azp), which would be the client; it needs to be in aud 12:05:11 s|[we reconvene after lunch]|[we reconvene after lunch, gibsonf1 joins] 12:05:23 present+ gibsonf1 12:06:20 [discussion on the respective role of the JWS claims in OAuth] 12:07:04 acoburn: we could say the 'aud' must contain both the RP and RS, and that 'azp' must be 'RP' 12:07:24 ... arguably this is most complete, and less subject to interpretation 12:07:33 ben: who is expected to generates that? 12:08:14 acoburn: the AS. You could use any AS you want, but it must produce a JWT that satisfies these constraints. 12:09:08 ... the most complicated thing we have to do right now is to define the structure of the token sent from RP to RS. 12:10:50 laurens: one problem with Solid today is that we are relying on OpenID Connect providers, who act both as Authentication and Authorization servers 12:11:33 ... we reuse the identity token as an auhtorization token 12:12:31 ... with Token-Exchange, we could define how to exchange the identity token for a complying access token, scoped to the operations you want to perform 12:13:09 ... the most common use-case is backend for frontend 12:13:38 ... the backend is taking the identity token from the user to get an access token for itself, limiting security risks 12:14:29 acoburn: some people in the DPop world consider it an anti-pattern to associate a DPop key with an identity token, and they are not wrong 12:14:44 ... currently, identity tokens in Solid are very powerful, could be reused in a malicious way 12:15:02 ... by requiring this exchange of token, the security scope becomes much more narrow 12:15:51 laurens: suppose you have a malicious Solid server, it gets an ID token; it can be reused with any other server you have access to 12:16:15 ... mechanisms like Token-Exchange allow you to prevent that 12:17:14 acoburn: the trick is that it is the application that the user uses that does the token exchange to scope it 12:17:31 gibsonf1: the way we do it is to restrict the token to the user AND the application 12:17:38 ... so the server can not reuse it as such 12:17:58 laurens: this addresses impersonation, but not the replay attack 12:18:42 bendm: does the RP not know where the request come from? 12:18:48 acoburn: no 12:19:40 laurens: in the authorization problem, we need to assume the token can come from anywhere 12:20:36 acoburn: the RP starts with the ID token, but it will never send it to the RS 12:20:48 ... (although that's what is happening right now) 12:21:46 ryey: if we are considering malicious RS, shouldn't we also consider malicious AS? 12:21:53 laurens: we should indeed. 12:22:16 ... If you have an ID token, it will be bound to the POST operation on the AS. 12:22:45 ... The malicious AS server can not replay this ID token on another AS server. 12:22:54 ... At least that's the threat model of Dpop. 12:23:36 ... Still, the problem with ID token is that they contain many claims about the identity of the user, and they are not properly restricted to the target audience. 12:24:58 acoburn: ryey, you were talking a malicious RS sending a legitimate RP to a malicious AS 12:25:02 ... that's a real problem 12:25:17 ... the way I would mitigate that: rather than sending the ID token directly to the AS, 12:25:37 ... the user controlling has a set of trusted token exchange servers 12:25:37 q+ to ask about scope between interactions AS/RP, why not trust the AS? 12:26:11 ... you exchange your ID token with this trusted server for a more restricted access server, that you then send to the AS 12:26:54 ... this protects the user even if the RS-AP pair is malicious 12:28:01 ... in this first exchange, the iss would be your token exchange server, the aud would be the AS you have been sent to 12:28:15 ... so it can not be reused anywhere 12:28:27 ack bendm 12:28:27 bendm, you wanted to ask about scope between interactions AS/RP, why not trust the AS? 12:28:52 bendm: is it necessary to do it like this in every use case? 12:29:01 ... if I trust the AS, can I skip the first step? 12:29:24 laurens: I'm assuming that the RP is not the owner of the RS. 12:29:43 ... In the case of the Flemish government, they are one and the same, so it is a simple case. 12:30:38 acoburn: in the use-cases we have addressed at Inrupt, it was more a federation than a distributed system 12:30:59 ... so the notion of malicious AS is moot in this context 12:31:28 ... there are cases where, even in a Federation, you would require this first token-exchange 12:31:37 ... I would make it possible but not mandatory 12:32:07 bendm: do we really need to describe these different levels of complexity? 12:32:28 ... what part of it is in our scope? should this be just a note? 12:32:53 acoburn: in my opinion, it is all out of scope, but we need to consider it. 12:33:13 ... It would be material for a primer, a best-practices document, but out-of-scope for the protocol document. 12:33:27 laurens: I tend to disagree. 12:33:52 ... the AS may provide you with a token-exchange grant, and if they do, the semantics needs to be defined 12:34:00 ... otherwise, this is a hindrance to interop. 12:34:50 acoburn: I don't think we want to require anything about token-exchange, 12:35:04 ... but I would agree that some document somewhere should explain: 12:35:13 ... "if you are to use token-exchange, this is what you need to do" 12:35:30 laurens: if you are to implement an LWS client that is authenticated, 12:35:38 ... what do you need to provide? 12:35:51 acoburn: how do you build interoperable clients? that's fair 12:36:35 laurens: currently, Solid OIDC is very simple (with security implications) 12:37:39 acoburn: in my mental model: you can configure your client to use a proxy server, without the client's developer being aware 12:37:44 ... in a way this is similar here 12:38:15 ... all the token-exchange part can be configured independently of the client 12:38:42 ... but I agree that we need to describe it somewhere 12:39:10 ericP: we need to specify how a client that can do token-exchange knows where and how to use it 12:40:34 laurens: what we have right now is an ill-designed solution 12:41:02 ... what we should avoid doing is throwing everything out of scope, and leave it to the implementers to discover what to use 12:41:18 ... we should strive for interoperable ecosystems 12:41:29 ... token-exchange is just one way to solve this problem 12:42:05 ... yes, we need to afford for evolutions, but we should not leave it entirely unspecified 12:42:45 bendm: I think what you are saying is that we must specify the RP-AS interaction, which I understood was out-of-scope 12:42:56 laurens: I don't think we have consensus that it is out-of-scope 12:43:06 ... the current Solid spec somehow specifies that 12:44:30 ... if we don't specify that part, different community will chose different non-interoperable solutions 12:44:50 ... we need some normative description of that part, maybe reusing an existing one 12:45:26 acoburn: I think we could define in abstract terms: "you need to provide a credential in some form, that contains this information: ..." 12:45:59 laurens: we are probably going to specify the identifiers of RP, and restrict the interactions between RP and AS 12:46:59 ... the interaction between RP and AS is essentially about authentication 12:47:16 acoburn: maybe we should switch the discussion to authentication, then 12:48:05 ... jeswr and I discussed during lunch, I would like to volunteer to make some proposal about what is needed here 12:48:13 ... I would like to volunteer Dmitri as well 12:48:50 laurens: there are several levels to which we could specify authorization 12:49:11 ... but specifying a policy language is probably scope for a WG in and of its own 12:49:18 acoburn: we have 6 months 12:49:29 ... I think it is out of the question to invent something new 12:49:41 ... I think it is out of the question to hack an existing solution to our needs 12:49:56 ... we can abstractly describe what we need, allowing future specifications to be used 12:50:23 laurens: I think defining an API for requesting/granting/revoking access is something we *can* do 12:50:42 ... it means a deviation from what we have in Solid right now 12:50:55 acoburn: there are different ways of scoping this 12:51:24 ... one way is to specify the "box" that stands bewteen RP and AS. I think this is doable. 12:51:36 ... and it may be swapable in the future 12:51:47 laurens: we could even reuse something existing here 12:52:48 pchampin: I think the decoupling mentioned in our charter puts all 3 edges in scope 12:52:58 jeswr: I'm supporting of that 12:53:19 ... I think the LWS spec should speak abstractly of the policy graph 12:53:42 acoburn: there is prior art for access request (SAI, the interop group, Inrupt's implementation) 12:54:11 laurens: there is also something that the Verifiable Credential people are doing 12:54:26 ... OpenID4VP 12:54:55 jeswr: does OpenID4VP involve an access request? 12:55:04 laurens: the Presentation Request is similar 12:55:37 jeswr: my understanding of OpenID4VP is that it is a closed flow; it does not allow for a user to intervene to consent to grant access 12:56:11 laurens: agreed; asynchronous access grant is something that OpenID wants to solve, and there are potential solutions to that, but that's complicated 12:56:22 bendm: do we also want to solve that? 12:56:55 laurens: they have similar use-cases to ours? 12:57:09 bendm: do we not run the risk of designing a competing solution, then? 12:57:58 laurens5 has joined #lws 12:57:58 laurens: they are also referring to 'Authorization details', we might try to solve some of these problems together, but as we have the same timeline, that may not be practical 12:58:02 https://openid.net/new-whitepaper-tackles-ai-agent-identity-challenges/ 12:58:24 bendm: should we spend the 6 months left solving something that others will solve in 1y? 12:58:39 ericP: do we have reasons to believe that our use-cases are unique? 12:59:00 laurens: I believe that we are looking at more affordances than they do. 12:59:30 jeswr: my naive hypothesis is that the pre-conditions around authorizations are going to be the same, but the effects might differ. 13:00:13 laurens: "me giving access to you to a resource on my storage" is not something they are trying to solve 13:00:55 ... their use-case is "me giving access to an agent to some service over which I have some control" 13:01:13 s/me giving access to you to a resource on my storage/me requesting access to a resource you control/ 13:02:39 bendm: we need to build something that is swapable 13:03:23 laurens: any protocol we define should be made in a generic way, with a concrete binding to a specific technology, similar to what we do for operations 13:04:41 bendm: do I understand correctly: I have my pod with my AS, and I give you access; how do we ensure that your client can interact with my AS 13:05:54 laurens describes some affordances in OAuth 13:06:15 laurens: what we want to avoid is each AS implementation inventing their own scheme 13:06:24 bendm: but we have existing schemes 13:06:32 laurens: yes but they are very generic 13:07:45 ... e.g. token-exchange is one specific grant of OAuth, and requires more specification to be useful 13:08:42 s/OAuth/OAuth2 13:09:06 ... it is not part of core OAuth2, so you need to specify "use OAuth2 + token-echange in this specific way" 13:10:11 q+ (to say after break) 1) no interaction between RS and AS ???; 2) we are too abstract yet and hard to persuade from either side; why don't we start from use cases, and see how they are supported by each mechanism? 13:10:54 s/q+ (to say after break)/q+ to say after break:/ 13:13:42 photo of the flipchart: https://www.w3.org/2025/10/09-lws-photo1.jpg 13:13:48 RRSAgent, make minutes 13:13:49 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 13:14:37 i|writing Authorization Server and Resource|topic: Authorization 13:14:46 RRSAgent, make minutes 13:14:47 I have made the request to generate https://www.w3.org/2025/10/09-lws-minutes.html pchampin 13:16:15 scribe+ 13:21:28 laurens: let's talk about Auth 13:21:47 i|let's talk about Auth|topic: Authentication 13:22:19 ryey: shouldn't we talk about interaction patterns between entities? which support which use cases? 13:22:37 acoburn: client-server / server-server: diversity is in authn 13:22:46 ... everything else ends up being the same 13:23:09 ryey: that probably won't work for all cases, being either too flexible or too complicated 13:23:18 laurens: 2 situations 13:23:56 ... 1: user A using client A, client A interacts with RS A and AS A 13:24:02 ... typical for Solid 13:24:31 user A has WebID, client A is non-confidential (runs in userspace: it cannot keep a secret from the user) 13:24:48 laurens: (said before line) 13:25:14 ... client A interacts with IdP A, user A gives, e.g. username/password via the client A 13:25:23 ... client is authenticated on its behalf 13:25:36 ... client probably needs to interact with AS A, on behalf of user A 13:26:02 ... as client A cannot have secrets from user A, it needs things like DPoP 13:26:28 ... sitaution 2: confidential client: has its own identity, can keep secrets from users 13:26:44 ericP has joined #lws 13:26:47 ... i.e. identities are decoupled 13:27:03 ... for situation 2, we currently need to hack around 13:27:43 ... we could do something with its own confidential client (let's call it client B) with its own oidc token, but that's out of solid's spec 13:28:17 ... we need some generic things to make sure both situations are possible, in LWS 13:28:34 acoburn: in OIDC, (either explicit or implied everywhere), OIDC is for browsers 13:28:42 ... that's what it's built for 13:28:57 laurens: and they refer to OAuth to do that 13:29:10 ... and mostly non-normative language I think 13:29:31 scribe+ 13:30:04 laurens: we can have 2 flows for 2 situations 13:30:12 ... non-confidential and confidential clients 13:30:21 i|we can have|bendm: is it naive to suggest that we have two situations, so we should have two flows? 13:30:26 scribe- 13:30:29 ... the scenarios need to be treated separately 13:31:22 ... you can imagine some kind of controlled identifier documents for confidential clients 13:31:32 ... for non-confidential clients, OIDC should be fine 13:32:13 ryey: what about, e.g. delegated actions (client A asking client B to do something?) 13:32:28 laurens: I would not specify anything between clients 13:32:36 acoburn: that could be built on top of LWS 13:33:05 ryey: but, it will be hard then to support combinated scenarios 13:33:12 ... eg the knoodle case 13:33:46 ... there's a web-based client, and a service, user interacts mostly with client, but sometimes the service needs to work independently 13:34:24 laurens: I think you are talking about a resource service 13:34:57 ... that will probably have its own resource server 13:35:40 ... what will not specified is 2 client applications that can arbitrarily start doing services without being chosen by the controller or storage provider 13:35:58 q+ to talk about services 13:36:18 jeswr: so I'm think about a server needing to ask something to the resource server 13:36:38 ... so a client application that has a server component 13:36:45 ... in that case, I would expect that's the same client 13:37:19 laurens: services over storage are either something chosen by the storage provider, or by the controller 13:37:59 acoburn: talking about client-to-client, in a sense, it's client-to-server, but then in 2 parts: same entity, but actually doing client-to-client service-to-storage 13:38:08 ... so maybe it's rather delegation? 13:38:24 ... i.e. that could be via a refresh token (if it's delegation) 13:38:31 ... or a service that works on its own behalf 13:38:48 ... in the latter case, it's a confidential client 13:39:24 ryey: OK, just wanted to understand whether the model makes that possible 13:39:37 laurens: now we come into impersonation and delegation 13:39:54 ... currently, Solid is mostly allowing impersonation 13:40:17 ... i.e. via WAC 13:40:35 q- 13:40:42 laurens: talking about delegation 13:41:01 ... OAuth token exchange is well positioned for delegation 13:41:13 ... it keeps the provenance during token exchange 13:41:28 acoburn: token exchange RDF has a very good section on impersonation vs delegation 13:41:39 ack bendm 13:42:00 bendm: I understand the usefulness of delegation. Is this something that we want to force on all LWS implementations as a MUST? 13:42:20 acoburn: we don't need to force it, but we need to describe how it would work 13:42:30 laurens: you should be able to do delegation if you want 13:42:47 ... delegation will likely be the best option 13:42:58 ... impersonation, only thing you can do is pod browser 13:43:08 ... for more restricted application, you run into problems 13:43:25 ... for which you need ACP or access request/grant in ESS 13:43:55 pchampin: does that mean that fine-grained access requires a confidential client? 13:44:00 laurens: I think no 13:44:43 ... the main distinction (which token exchange does really well): an actor claim that gives the full actor chain during exchange 13:45:10 ... so provenance/delegation chain you can follow 13:45:45 ... good for frontend+backend for frontend and proxy, for example 13:46:35 bendm: beating a dead horse: I want to still be able to deploy a simple solution 13:47:06 laurens: I would want the authz server to clarify that the user might want to do something dangerous 13:47:11 laurens: as long as the user is notified that they are doing something dangerous 13:47:20 acoburn: azp claim (ie identity of the client) 13:47:24 s|laurens: as long as the user is notified that they are doing something dangerous| 13:48:25 ... for non-confidential client: solid-OIDC specifies how to get an identity token 13:48:35 ... for confidential client: no specification currently exists 13:48:38 ... and it should 13:48:48 +1 13:48:53 laurens: another problem is dynamic client discovery 13:49:16 ... eg using keycloak: you need to do static client registration 13:49:26 ... manually creating client id and secret 13:49:36 ... that's a typical flow 13:50:15 ... dynamic client registration (ie. client is RP): IdP might have never heard of that RP 13:50:55 acoburn: dynamic client registration used to be the only way in Solid to bootstrap client flow 13:51:12 laurens: authz needs to know where the user should be redirected to 13:51:55 ... PCKE prevents replay attacks 13:52:24 ... client id documents is another way to solve that 13:53:02 acoburn: dynamic client registration: you don't have an identity for your RP, it's the same as an anonymous IdP/it's ephemeral 13:53:22 ... i.e. you cannot distinguish 2 dynamically registered clients 13:54:00 ... my position: we should not use dynamic client registration 13:54:24 laurens: +1, also, we need something for confidential clients 13:54:44 s/PCKE/PKCE 13:55:00 jeswr: if we don't have dynamic registration, does that mean we always need a client header or something? 13:55:11 acoburn: an allow list is unusable 13:55:58 jeswr: so, as an application implementer, I don't need to ask an idp to be added? 13:56:22 laurens: each app registering themselves at all IdPs is not scalable 13:57:01 ... we do need affordance to advertise the right attributes in a describing document (ie to be verifiable, what we do with client id documents) 13:57:17 acoburn: let's start with confidential clients, they're easier to solve 13:59:32 ... requirement: I want to give access for certain types of data to certain types of applications, then dynamic client registration doesn't solve this 14:00:04 acoburn: confidential clients 14:00:15 dmitriz has joined #lws 14:01:50 ... JWT: sub = iss 14:02:01 bendm: is it the way you propose it? the way it is done in prior art? 14:02:07 laurens: this is different from client credentials 14:02:34 ... client credentials rely on external authz 14:02:41 ... server (AS) 14:03:17 acoburn: conf client: either delegates to external identity provider, or stores the secret itself 14:03:42 ... question is: who has the private key material? 14:04:01 ... client credentials flow: you ask the IdP to give you a JWT, then iss and sub claims will be different 14:04:22 ... other idea is that the client has its own private key, then iss and sub are the same 14:04:49 laurens: you can base this on the controlled identifier spec 14:05:22 acoburn: and then the CID is the same as the sub/iss 14:05:37 ... and there's a way of expressing a public JWT 14:06:09 laurens: here, we assume that the client has control of the private key 14:06:18 ... client will build the token itself 14:07:07 laurens: this will be something that we will have to spec? 14:07:28 acoburn: in this case, you want the audience to be the AS 14:08:16 bendm: couldn't the AS just be told to trust this client? 14:08:30 acoburn: yes, that's what would be in the policy 14:08:53 laurens: that's probably what we need to have a notification flow of 14:09:24 acoburn: another part is the code grant, part of OAuth 14:09:27 ... this is private key JWT 14:10:04 ... there is an existing OAuth flow that describes this 14:10:11 laurens: probably in the client assertion spec 14:11:13 ... what we need to spec is the AS to resolve the CID, get the JWK, to validate the signed JWT 14:11:36 ... eg the flemish gnmt also uses that JWT, but we have a service where clients need to register with a JWK 14:12:51 bendm: I assume there are many other ways to do this; this is just how we recommend to do it, right? 14:13:13 laurens: I think you'll have 2 scenarios: an agent that refers to an IdP to assert they identity, and clients that self-assert their identity 14:13:31 ... I think we need to support both 14:14:15 acoburn: technically, in the headers, there's going to be a key ID (kid), whereas the CID is your subject. so the key material will be the subject + kid 14:14:26 ... I think CID alreayd has that 14:14:49 pchampin : CID is published with VC2 14:15:00 ... it's a generalization of the DID document, and DID will depend on CID 14:15:18 ... CID is about the document format, not how you resolve it 14:15:40 laurens: we kind of ssume here that we know how to resolve a CID 14:15:59 ... I desire to have at least one resolution mehod in the spec 14:16:37 pchampin: in retrospect, DID adds on top of CID: a new type of identifier and a way how to resolve 14:18:03 bendm: talking aoubt pseudonimity 14:18:48 pchampin: so actually, you not really are talking about confidential and non-confidential client, but rather IdP-asserted and self-asserted clients? 14:19:21 ... the CID could be an ephemeral DID 14:19:53 laurens: in OIDC, you will always have a strong-asserted identity 14:20:49 bendm: so you could have self-asserted identities, also in client-server sitautions 14:24:17 laurens: what we have been doing now, is the interaction between the RP and the IdP 14:24:36 ... and IdP is part of the OIDC-flows 14:25:13 acoburn: in OAuth, they typically have an OP (OpenID Provider), which we call IdP, which can be separate from the AS 14:25:45 ... and the category of confidential clients that have self-asserted identities do not have an IdP/OP 14:26:04 laurens: for non-confidential clients, I assume the users of those clients also need to validate their identity 14:26:19 pchampin: that's ucrrently the purpose of the WebID document? 14:26:40 ... CID is a reduced WebID, without the profile information 14:26:57 laurens: eg OpenID Provider could be a service in the user's CID 14:27:19 acoburn: now we're talking about non-confidential clients 14:27:35 ... how can we scope this so that it doesn't rely on non-spec things (such as WebID), but is still secure? 14:28:29 ... sub = cid, iss = openid provider 14:28:51 ... and OpenID Provider needs to be listed in the CID services 14:29:15 laurens: this is really similar to the SolidOIDC 14:29:49 acoburn: SolidOIDC has 3 features: the WebID scope results in a WebID claim 14:30:01 ... we can use sub, being more aligned with everything else 14:30:35 laurens: some AS are opinionated towards the sub 14:30:45 ... opaque to the user but does identify it 14:31:04 ... so that's not necessarily the same as using the (resolvable) CID 14:31:39 acoburn: so some OpenID Providers put restrictions on the sub claim? so we might need to refer to a CID document in a different claim? 14:32:25 laurens: yes, there might be some issues 14:32:32 acoburn: what about the claim 'preferred username'? 14:32:38 laurens: feels like overloading 14:32:48 ... why was the webid claim introduced? 14:32:57 acoburn: more historically? 14:33:32 laurens: there has been a tendency for openID Providers to create new claims, rather than overloading existing ones 14:34:15 ... it would be good to have the option of a fallback: first check a custom claim, and if not available, look at the subject 14:34:18 acoburn: +1 14:34:26 ... any suggestion for claim name? 14:35:14 ... it's a web-based identity system... soooo... webid? 14:35:39 pchamin: we could do controlled web identifier: cwid? pronounced seaweed 14:36:02 acoburn: either in the JWT spec or OIDC specs, they talk about minting custom claims 14:36:27 ... if you use a non-globally unique claim name (eg webid), you could register at iana 14:37:41 ... or create a globally unique name, i.e. a URI for the claim key 14:37:44 laurens: we could use the actor claim 14:37:56 acoburn: we should doublecheck 14:38:14 pchampin: but it still falls under the pitfall that we run the risk of overloading? 14:38:42 ... I don't have strong opinions on URI vs IANA (we can do both) 14:38:57 ... and I understand the issue of using a URI as a key in JSON 14:39:18 acoburn: actor claim is used as a json object that has a sub claim 14:39:42 laurens: if you have token delegation, then that initial subject claim is buried the deepest 14:41:36 jeswr: does this mitigate the need for zcaps for delegated authority 14:41:48 laurens: it's a way to express delegation chains in JWTs 14:41:53 ... you still need a trust relation 14:42:07 acoburn: zcaps themselves are typically not sent as bearer tokens 14:42:22 ... so your processed token might not contain the full delegation chain 14:43:00 laurens: prior actors are informational only... hmmm, so this might not actually work (you need to use the sub according to the spec) 14:43:52 acoburn: let's have a placholder for now 14:44:22 ... so, we have the fallback: first a specific claim (either a URI or an IANA registered name), if not available, try sub claim 14:44:40 ... placeholder is called agent_id for now 14:45:35 ... currently in solid, id tokens are directly sent to RSs 14:46:01 ... in cases where ID tokens are not required to be directly sent to RSs or ASs, then the MUST for DPoP-bound ID tokens is no longer relevant 14:46:20 ... you can still use DPoP to bind id tokens or access tokens 14:46:31 laurens: if you can bind this token to a specific audience, ie the AS 14:46:35 ... then yes 14:46:56 ... but that audience claim is important (AS, or another token exchange service) 14:47:24 acoburn: so we could say: if you're not able to perform token exchange, the audience claim should be scoped to the AS 14:48:02 laurens: if you mandate that tokens are the proper AS/IdP token exchange, so removing the solid audience, you lose the requirement for DPoP 14:48:17 ... what remains, is how non-confidential clients manage their key material 14:48:51 ... so there are probably some security things to be considered 14:49:12 acoburn: the last requirement of Solid-OIDC is client identifiers: that's the azp claim 14:49:32 laurens: I don't think that OpenID has something 14:49:45 acoburn: there's OpenID federation, but that's a lot of overhead 14:50:12 ... there's Amelia and others who have taken the azp part as a separate spec, but I'm not sure about their timeline 14:50:40 ... question is: how do you identify the client with strongly stable identifiers? 14:51:30 ... the client id document is basically the info of dynamic client registration, this could be put/reformated in a CID 14:51:40 laurens: I would have hoped there was a solution already 14:52:32 acoburn: I would say: you should be using a strongly asserted global identification for the azp claim, this could be openid federation, but also could be client document 14:52:41 laurens: static client registration systems should also be fine 14:53:13 ... but I would want at least one spec'd 14:53:23 acoburn: I'm not sure we need jsonld 14:53:49 jeswr: I see use cases beyond authn.authz flows 14:54:09 laurens: we could do jsonschema, with extensibility towards a context file 14:54:38 jeswr: when we discussed containers, we discussed both jsonschema and context, I suggest, for consistency, to do the same here 14:54:43 laurens: I'm not opposed to that 14:55:28 ... what we need to talk about, cfr access requests and grants, for which we need client app identity 14:55:39 acoburn: talking about topics/responsibilities 14:56:05 ... I wanted to volunteer for the authz spec, specifically on the boundaries to the RS 14:56:22 jeswr: I would like to pair 14:56:45 ericP: I would also love to pair 14:56:56 acoburn: regardless, there will be a lot of discussion 14:57:15 ... I will lean a lot on Dmitri and Bango 14:57:21 ... they will provide a lot of useful content 14:57:45 laurens: how do split between Authn/Authz, and their facets? 14:58:10 acoburn: I think: what are the inputs for the authz, maybe not defining specific formats, but the inputs 14:58:25 ... one of these inputs could be 'a strongly asserted identity token' 14:58:41 ... separately, we can define how that input looks like 14:58:52 laurens: we could define some token types 14:59:02 ... and we might need to specify some of the validation rules and structure 14:59:15 acoburn: for authz, authn seems to be one of the inputs 14:59:28 ... do we have a separate task for for authn, or is it one big bundle? 14:59:46 ... (separate from the editing) 14:59:46 ... we could have different specs 15:00:08 laurens: input for the authz functions will be the start, so I suggest to start there 15:00:14 ... and later define the gaps 15:01:24 laurens: about the identity documents and client id documents 15:01:33 ... are those separate, or are they relevant in the context of authn? 15:01:50 acoburn: absent any better ideas, I suggest to define them in the context of authn 15:02:07 ... I'm willing to work on authn as well 15:02:09 laurens: me too 15:03:07 bendm: do we agree that other kinds of claim, like proving what your name is, are out of scope? 15:03:22 laurens: up to now, we discussed discretionary access control: someone is given access to do certain access on certain resources 15:03:52 ... it could be RBAC or ABAC, but that's out of scope of the specs 15:04:12 ... if anyone feels that we would still need that, feel free to suggest anything 15:04:50 acoburn: we don't prevent any implementation (existing or new) to adhere to this 15:05:04 laurens: the spec is the subset of what we can agree on, the implementers can do fun new stuff on top of this 15:05:48 laurens5 has joined #lws 15:05:48 wonsuk has joined #lws 15:05:48 ryey has joined #lws 15:05:48 laurens has joined #lws 15:05:48 bendm has joined #lws 15:05:48 gibsonf1 has joined #lws 15:06:04 acoburn: concerning timeframe: my availability is limited 15:07:04 laurens5 has joined #lws 15:07:04 wonsuk has joined #lws 15:07:04 ryey has joined #lws 15:07:04 laurens has joined #lws 15:07:04 bendm has joined #lws 15:07:04 gibsonf1 has joined #lws 15:07:12 ... we'll be back tomorrow at 9:30 15:07:30 ... dinner tonight at 7pm at Patrick Foleys