<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 19 November 2015 at 19:26, Bill Burke <span dir="ltr">&lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
<br>
On 11/19/2015 9:58 AM, Stian Thorgersen wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">
<br>
<br>
On 19 November 2015 at 15:43, Bill Burke &lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a><br></span><span class="">
&lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;&gt; wrote:<br>
<br>
    FYI, there&#39;s other problems too.  Built in clients are looked up via<br>
    their hardcoded ClientIds &quot;admin-console&quot; &quot;broker&quot; etc, again<br>
    because DB ids are generated.<br>
<br>
    I just don&#39;t see how you can remove ID or ClientID. ID is URL<br>
    friendly, ClientID isn&#39;t and needs to be encoded.  ID is pretty much<br>
    hidden from the user until they want to use the REST interface.  If<br>
    you remove ID from the REST interface then ClientID @PathParams are<br>
    gonna have to be encoded which could be a real pain for users,<br>
    especially ones using simple HTTP.  While most libraries will encode<br>
    query and form params, users will have to encode by hand other<br>
    mechanisms.<br>
<br>
<br>
For clients I was thinking we should remove ClientID, not ID. We&#39;d allow<br>
specifying the ID when creating a new client, but not changing it. The<br>
ID would also have to be URL friendly.<br>
<br>
</span></blockquote>
<br>
Removing clientID doesn&#39;t work for built-in clients like account, broker, admin-console, etc.  These all need to be located using a predetermined name.  You&#39;d have to figure out an additional alternative to refactor that.</blockquote><div><br></div><div>Is it not actually bad that they are located using predetermined names? If lookup is on id, you know for a fact that it&#39;s the correct client and not just something with the same name.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
    There&#39;s a similar problem with Groups.  Groups are looked up via a<br>
    &quot;path&quot; name &quot;/parent/child&quot;  in the REST interface, then you have<br>
    use the ID to reference the rest of the GROUP rest interface i.e.<br>
    groups/{ID}/children.<br>
<br>
<br>
    We&#39;ll have similar problems with role namespaces if you want to<br>
    incorporate them into the REST interface.<br>
<br>
    ClientId should be forced to become a URL friendly string (no<br>
    special characters or &#39;/&#39; or &quot;?&quot;, etc.).  SAML can introduce an<br>
    Issuer URL or something.  After that, you can remove ID.  That&#39;s the<br>
    only solution I can see that will work well.<br>
<br>
<br>
For groups and roles couldn&#39;t the ID be the full path? Then the REST<br>
endpoints would be aware of &quot;hierarchies&quot; so you could just do:<br>
<br>
get /auth/realms/groups/group-parent/group-child<br>
<br>
And:<br>
<br>
get /auth/realms/roles/role/path/to/role/myrole<br>
<br>
</blockquote>
<br></span>
I didn&#39;t even try to see if that worked.   The issue is that there are additional endpoints after the path:<br>
<br>
.../children<br>
.../composites<br>
<br>
And methods to add remove group children and role composites.  I&#39;m pretty sure there are some JAX-RS and/or regular-expression mapping issues with that.  At least that&#39;s what I remember, might be a false memory.</blockquote><div><br></div><div>Didn&#39;t think of the additional stuff under each element. Even if it works it would be messy.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
??<br>
<br>
I think the current approach of having REST endpoints that retrieve<br>
based on ID is a pain point for a lot of users. They create a client<br>
with a named client-id or role with a name, then have to use a different<br>
ID to retrieve from the rest endpoints<br>
<br>
</blockquote>
<br></span>
The way it works for groups now is that i have a /group-by-path lookup mechanism which returns a GroupRepresentation, the id is extracted from that, then you invoke from there, i.e.:<br>
<br>
GroupRepresentation topGroup = realm.getGroupByPath(&quot;/the/top&quot;);<br>
List&lt;RoleRepresentation&gt; roles = new LinkedList&lt;&gt;();<br>
roles.add(topRole);<br>
realm.groups().group(topGroup.getId()).roles().realmLevel().add(roles);<br>
<br>
Alternatively we could add links to the GroupRepresentation like &#39;self&#39; that points to the resource endpoint.<br></blockquote><div><br></div><div>I never liked it when we had multiple entry points to the same resource. What about using something like:</div><div><br></div><div>GET ../users?username=&lt;myusername&gt;&amp;single=true</div><div>GET ../users?email=&lt;myemail&gt;&amp;single=true<br></div><div><br></div><div>That returns a single UserRepresentation including &#39;self&#39; (../users/&lt;user-id&gt;).</div><div><br></div><div>Same for groups:</div><div><br></div><div>GET ../groups?path=&lt;url encoded path&gt;&amp;single=true</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">
<br>
<br>
<br>
    On 11/19/2015 8:59 AM, Stian Thorgersen wrote:<br>
<br>
        How about:<br>
<br>
        * IDs are usually generated, but can be specified. It should not be<br>
        possible to change them though<br>
<br>
        * Instead of alias, name and all other ways of setting a human<br>
        readable<br>
        name we add Display Name and Display Class<br>
<br>
        Not sure how to deal with migration, but if we agree on those<br>
        points,<br>
        then we can figure that out<br>
<br>
        On 19 November 2015 at 14:49, Bill Burke &lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a><br>
        &lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;<br></span><div><div class="h5">
        &lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a> &lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;&gt;&gt; wrote:<br>
<br>
             One more thing.  Another problem is that if you switch to<br>
        ID for<br>
             everything, then demos etc. will no longer run out of the<br>
        box and you&#39;ll<br>
             have to modify adapter configuration to set the newly<br>
        generated DB id.<br>
             Really, any piece of configuration that references things<br>
        by client ID<br>
             will no longer work.<br>
<br>
             So, there&#39;s really 2 issues:<br>
<br>
             * Using ClientID in admin-console URLs doesn&#39;t work well as<br>
        the client<br>
             IDs could have &#39;/&#39; characters in them<br>
             * Using ID only messes up pre-defined, pre-packaged adapter<br>
        config and<br>
             you have to edit these files after the keycloak DB is set up.<br>
<br>
             On 11/19/2015 8:40 AM, Bill Burke wrote:<br>
              &gt; We currently actually have 3 client identifers:  ID,<br>
        ClientID,<br>
             and Name.<br>
              &gt;<br>
              &gt; Also, I think there are a lot of duplicate clientID<br>
        names between<br>
              &gt; realms.  i.e. &quot;admin-console&quot; &quot;broker&quot;, etc...<br>
              &gt;<br>
              &gt; A search by clientID is (realm + clientID).<br>
              &gt;<br>
              &gt; Marek is right about why I switched everything to ID in<br>
        the admin<br>
              &gt; console.  For SAML I just didn&#39;t want to add yet another<br>
        client<br>
              &gt; identifier since we already had 3.<br>
              &gt;<br>
              &gt; On 11/19/2015 7:52 AM, Marek Posolda wrote:<br>
              &gt;&gt; +1 for this change.<br>
              &gt;&gt;<br>
              &gt;&gt; I am just not sure if we should set the &quot;id&quot; to the<br>
        current value of<br>
              &gt;&gt; &quot;client-id&quot; ? Few things to note:<br>
              &gt;&gt;<br>
              &gt;&gt; - SAML clients currently use clientId in form of URL.<br>
        For example in<br>
              &gt;&gt; SAML demo there are clientIds like<br>
             &quot;<a href="http://localhosT:8080/employee-sig" rel="noreferrer" target="_blank">http://localhosT:8080/employee-sig</a>&quot;<br>
              &gt;&gt; . I don&#39;t know if it&#39;s requirement, maybe it&#39;s possible<br>
        to solve it<br>
              &gt;&gt; somehow (ie. introduce different attribute for SAML<br>
        client to store<br>
              &gt;&gt; these URLs). But from what I remember, Bill changed admin<br>
             console to use<br>
              &gt;&gt; &quot;id&quot; instead of &quot;clientId&quot; because there were issues<br>
        with URL-like<br>
              &gt;&gt; clientId in admin console . So if we overwrite the &quot;id&quot;<br>
        with current<br>
              &gt;&gt; &quot;client-id&quot; the issue will be back.<br>
              &gt;&gt;<br>
              &gt;&gt; - Migration might be a pain. Many tables (roles,<br>
             protocolMappers, user<br>
              &gt;&gt; consents, offline clientSessions ...) references client<br>
        by &quot;id&quot; .<br>
              &gt;&gt; Overwriting &quot;id&quot; with &quot;client-id&quot; means that we will<br>
        need to<br>
             change all<br>
              &gt;&gt; those DB records. And there are things like foreign<br>
        keys etc...<br>
              &gt;&gt;<br>
              &gt;&gt; Shouldn&#39;t do vice-versa and just remove current<br>
        &quot;client-id&quot; and ask<br>
              &gt;&gt; people to update their keycloak.json adapter<br>
        configurations? On the<br>
              &gt;&gt; other hand, removing &quot;client-id&quot; might break migration<br>
        of JSON<br>
             exported<br>
              &gt;&gt; realms as the JSON entities are using &quot;client-id&quot; for<br>
             referencing client.<br>
              &gt;&gt;<br>
              &gt;&gt; It seems the migration will be a pain regardless of<br>
        whatever<br>
             direction<br>
              &gt;&gt; we choose :-(<br>
              &gt;&gt;<br>
              &gt;&gt; Marek<br>
              &gt;&gt;<br>
              &gt;&gt; On 16/11/15 14:54, Stian Thorgersen wrote:<br>
              &gt;&gt;&gt; We have both &quot;id&quot; and &quot;client-id&quot; for clients in<br>
        Keycloak at the<br>
              &gt;&gt;&gt; moment. This seems unnecessary and complex.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; The model can retrieve clients on either value. In token<br>
             endpoints the<br>
              &gt;&gt;&gt; &quot;client-id&quot; is used. In admin endpoints the &quot;id&quot; is used.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; Also, in most cases it would be simpler for users to<br>
        just have a<br>
              &gt;&gt;&gt; generated id than having to come up with one<br>
        themselves. The id<br>
              &gt;&gt;&gt; doesn&#39;t have to be human readable either as we have<br>
        name for that.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; OpenID Connect expects &quot;client-id&quot; to be generated by<br>
        the IdP and<br>
              &gt;&gt;&gt; can&#39;t be changed once created.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; I propose we remove &quot;client-id&quot; and only keep id.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; For migration of existing clients we would set the<br>
        &quot;id&quot; value<br>
             to the<br>
              &gt;&gt;&gt; current value of &quot;client-id&quot;. This would require no<br>
        changes to<br>
             adapter<br>
              &gt;&gt;&gt; configs. When creating new clients from the admin<br>
        console we<br>
             would not<br>
              &gt;&gt;&gt; allow setting the &quot;client-id&quot;, instead just display it<br>
        after the<br>
              &gt;&gt;&gt; client was created. When importing clients it would be<br>
        possible<br>
             to set<br>
              &gt;&gt;&gt; the id (and for backwards compatibility we would set<br>
        &quot;id&quot; equal<br>
             to the<br>
              &gt;&gt;&gt; &quot;client-id&quot; field.<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt;<br>
              &gt;&gt;&gt; _______________________________________________<br>
              &gt;&gt;&gt; keycloak-dev mailing list<br>
              &gt;&gt;&gt; <a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;<br></div></div>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><span class=""><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;&gt;<br>
              &gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
              &gt;&gt;<br>
              &gt;&gt;<br>
              &gt;&gt;<br>
              &gt;&gt; _______________________________________________<br>
              &gt;&gt; keycloak-dev mailing list<br>
              &gt;&gt; <a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;<br></span>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><span class=""><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;&gt;<br>
              &gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
              &gt;&gt;<br>
              &gt;<br>
<br>
             --<br>
             Bill Burke<br>
             JBoss, a division of Red Hat<br>
        <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
             _______________________________________________<br>
             keycloak-dev mailing list<br>
        <a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;<br></span>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a><span class=""><br>
        &lt;mailto:<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>&gt;&gt;<br>
        <a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a><br>
<br>
<br>
<br>
    --<br>
    Bill Burke<br>
    JBoss, a division of Red Hat<br>
    <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
<br>
<br>
</span></blockquote><div class=""><div class="h5">
<br>
-- <br>
Bill Burke<br>
JBoss, a division of Red Hat<br>
<a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
</div></div></blockquote></div><br></div></div>