<div dir="ltr"><div>I have finished the work on JWT tokens according to current MVP use cases at <a href="https://pulp.plan.io/projects/pulp/wiki/Pulp_3_Minimum_Viable_Product">https://pulp.plan.io/projects/pulp/wiki/Pulp_3_Minimum_Viable_Product</a>. Please check out my pull request at <a href="https://github.com/pulp/pulp/pull/3109">https://github.com/pulp/pulp/pull/3109</a>. </div><div><br></div><div>I have also included docs on how to generate the tokens offline and how JWT authentication work in pulp in general.</div><div><br></div><div>If you have any recommendations regarding the docs or anything else I would love to hear them in the comments. </div><div><br></div><div>Also during the review of this PR, we have discovered that we can't any longer install pulp via `python setup.py install/develop`  because thanks to the name of the JWT package (djangorestframework-jwt) we are affected by the setup-tools <a href="https://github.com/pypa/setuptools/issues/196">https://github.com/pypa/setuptools/issues/196</a> hyphen issue.  So I made a PR <a href="https://github.com/pulp/pulp/pull/3111">https://github.com/pulp/pulp/pull/3111</a> for Travis to begin using `pip install -e .` as we already use in vagrant's Ansible.</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 31, 2017 at 2:26 PM Dennis Kliban <<a href="mailto:dkliban@redhat.com">dkliban@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">We had a chance to discuss some of these use cases during our MVP call yesterday. Here is the updated list of uses cases:</div><div dir="ltr"><br><br><div id="m_1961670470293051741gmail-magicdomid29" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an administrator, I can disable JWT token expiration.  This configuration is in the settings file and is system-wide.</span></div><div id="m_1961670470293051741gmail-magicdomid30" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid31" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As
 an administrator, I can configure the JWT tokens to expire after a  
configurable amount of time. This configuration is in the settings file 
 and is system-wide.</span></div><div id="m_1961670470293051741gmail-magicdomid32" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid33" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">The JWT shall have a username identifier</span></div><div id="m_1961670470293051741gmail-magicdomid34" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid35" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an API user, I can authenticate any API call (except to request a JWT) with a JWT.</span></div><div id="m_1961670470293051741gmail-magicdomid36" class="m_1961670470293051741gmail-"></div></div><div dir="ltr"><div id="m_1961670470293051741gmail-magicdomid37" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an API user, I can invalidate all existing JWT tokens for a given user</span><span class="m_1961670470293051741gmail-author-a-sz78z4z72z8z79zaxnsz66z2z77zz79zz74zn">.</span></div><div id="m_1961670470293051741gmail-magicdomid38" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid39" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an authenticated user, when deleting a user 'foo', all of user 'foo's</span><span class="m_1961670470293051741gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z"> existing</span><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf"> JWTs are invalidated.</span></div><div id="m_1961670470293051741gmail-magicdomid40" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid41" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an autheticated use</span><span class="m_1961670470293051741gmail-author-a-sz78z4z72z8z79zaxnsz66z2z77zz79zz74zn">r, I can invalidate a user's JWTs in the same operation as updating the password.</span></div><div id="m_1961670470293051741gmail-magicdomid42" class="m_1961670470293051741gmail-"></div><div id="m_1961670470293051741gmail-magicdomid43" class="m_1961670470293051741gmail-"><span class="m_1961670470293051741gmail-author-a-niz90zyz85zz83zz83zz82zz74z8z85z6z90zhz84zf">As an un-authenticated user, I can obtain a JWT token by using a username and password.</span></div><div id="m_1961670470293051741gmail-magicdomid44" class="m_1961670470293051741gmail-"><br></div><div id="m_1961670470293051741gmail-magicdomid44" class="m_1961670470293051741gmail-">Let's polish them up on this email thread and then update the MVP wiki page. <br><br></div></div><div dir="ltr"><div id="m_1961670470293051741gmail-magicdomid44" class="m_1961670470293051741gmail-">-Dennis<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 29, 2017 at 1:57 PM, Brian Bouterse <span dir="ltr"><<a href="mailto:bbouters@redhat.com" target="_blank">bbouters@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>We had a use case call which produced these use cases [0]. Then @fdobrovo investigated using the django-rest-framework-jwt [1] to fulfil those use cases and there are some small, but to fulfil the use cases written he had to write a good amount of code and maybe only used 50 or 100 lines of code actually from django-rest-framework-jwt.<br><br>Through a lot of back and forth on the issue [2], we did a gap analysis and considered different ways the use cases could be aligned with the functionality provided by the django-rest-framework. We came up with the following revised use cases related to JWT that are effectively the same and would allow the plugin code to be used mostly as-is:<br><br><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid300" class="m_1961670470293051741m_7221017809433058029gmail-ace-line"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">* As an administrator, I can disable JWT token expiration.  This configuration is in the settings file and is system-wide.</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid273" class="m_1961670470293051741m_7221017809433058029gmail-ace-line"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">*
 As an administrator, I can configure the JWT tokens to expire after a 
configurable amount of time. This configuration is in the settings file 
and is system-wide.</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid8" class="m_1961670470293051741m_7221017809433058029gmail-"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">* The JWT shall have a username identifier</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid227" class="m_1961670470293051741m_7221017809433058029gmail-ace-line"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">* As an API user, I can authenticate any API call (except to request a JWT) with a JWT.</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid10" class="m_1961670470293051741m_7221017809433058029gmail-"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">* As an API user, I can invalidate all JWT tokens for a given user</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid11" class="m_1961670470293051741m_7221017809433058029gmail-"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">* As an authenticated user, when deleting a user 'foo', all of user 'foo's JWTs are invalidated.</span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid268" class="m_1961670470293051741m_7221017809433058029gmail-ace-line"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-z71zz70zkz66zki3s0z75zz67z0rlz73zo">* As an </span><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">un-</span><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-z71zz70zkz66zki3s0z75zz67z0rlz73zo">authenticated user, I can obtain </span><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">a</span><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-z71zz70zkz66zki3s0z75zz67z0rlz73zo"> JWT token,</span><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z"> by passing a username and password via POST<br><br></span></div><div id="m_1961670470293051741m_7221017809433058029gmail-magicdomid268" class="m_1961670470293051741m_7221017809433058029gmail-ace-line"><span class="m_1961670470293051741m_7221017809433058029gmail-author-a-4z69zz89z5nz73z6jk2g24z89zz85zz66z">Comments and questions are welcome here. I also hope to append this topic onto one of the upcoming, Tuesday use case calls. The next call May 30th is on the Status API and Alternate Content Sources so hopefully there will be enough time to revisit the JWT use cases then too or on a following call.<br></span></div></div><div><br>[0]: <a href="https://pulp.plan.io/projects/pulp/wiki/Pulp_3_Minimum_Viable_Product#Authentication" target="_blank">https://pulp.plan.io/projects/pulp/wiki/Pulp_3_Minimum_Viable_Product#Authentication</a><br>[1]: <a href="http://getblimp.github.io/django-rest-framework-jwt/" target="_blank">http://getblimp.github.io/django-rest-framework-jwt/</a><br>[2]: <a href="https://pulp.plan.io/issues/2359" target="_blank">https://pulp.plan.io/issues/2359</a><span class="m_1961670470293051741HOEnZb"><font color="#888888"><br><br></font></span></div><span class="m_1961670470293051741HOEnZb"><font color="#888888">-Brian<br></font></span></div>
<br>_______________________________________________<br>
Pulp-dev mailing list<br>
<a href="mailto:Pulp-dev@redhat.com" target="_blank">Pulp-dev@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/pulp-dev" rel="noreferrer" target="_blank">https://www.redhat.com/mailman/listinfo/pulp-dev</a><br>
<br></blockquote></div><br></div>
_______________________________________________<br>
Pulp-dev mailing list<br>
<a href="mailto:Pulp-dev@redhat.com" target="_blank">Pulp-dev@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/pulp-dev" rel="noreferrer" target="_blank">https://www.redhat.com/mailman/listinfo/pulp-dev</a><br>
</blockquote></div><div dir="ltr">-- <br></div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px"><div>Kind Regards,<br><br></div>Filip Dobrovolny.<br></div><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px"><br></div><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px"><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px"><span style="margin:0px;padding:0px">Filip</span> <span style="margin:0px;padding:0px">Dobrovolný</span></p><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px"></p><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px"><span style="margin:0px;padding:0px"><span style="margin:0px;padding:0px">Intern, Pulp</span> </span><br style="margin:0px;padding:0px"></p><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px">Red Hat <span style="margin:0px;padding:0px">Czech s.r.o</span></p><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px"><span style="margin:0px;padding:0px"><span style="margin:0px;padding:0px"><a href="mailto:fdobrovo@redhat.com" target="_blank">fdobrovo@redhat.com</a></span>     </span><span style="margin:0px;padding:0px">M: <a href="tel:+420-608-321-501" target="_blank" style="margin:0px;padding:0px">+420-608-321-501</a>    </span> <span style="margin:0px;padding:0px">IM: <span style="margin:0px;padding:0px">fdobrovo</span></span></p><p style="color:rgb(0,0,0);font-family:overpass-mono,monospace;font-size:10px;margin:0px;padding:0px"><span style="margin:0px;padding:0px"><a href="http://redhat.com/" target="_blank">redhat.com</a> | <span style="margin:0px;padding:0px">TRIED. TESTED. TRUSTED. | <a href="http://redhat.com/trusted" target="_blank">redhat.com/trusted</a></span></span></p></div></div></div>