From cb4c54074a6915e33207c4fa6daca1554949912b Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Tue, 4 Jul 2017 22:25:16 -0500 Subject: [PATCH] Tutorial 1 --- _static/tuts/tut1-jwt-io.png | Bin 0 -> 60572 bytes index.rst | 1 + tutorials/tut0.rst | 2 + tutorials/tut1.rst | 245 +++++++++++++++++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 _static/tuts/tut1-jwt-io.png create mode 100644 tutorials/tut1.rst diff --git a/_static/tuts/tut1-jwt-io.png b/_static/tuts/tut1-jwt-io.png new file mode 100644 index 0000000000000000000000000000000000000000..488b87f1034660f5325c69c1d657427416c50b49 GIT binary patch literal 60572 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 VyfAReV_;xl@O1TaS?83{1OR|zTu1-_ literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 28fa94a09..b3ab8b26f 100644 --- a/index.rst +++ b/index.rst @@ -14,6 +14,7 @@ :caption: Tutorials tutorials/tut0.rst + tutorials/tut1.rst .. toctree:: :caption: Installation diff --git a/tutorials/tut0.rst b/tutorials/tut0.rst index 305095355..a762bc7d1 100644 --- a/tutorials/tut0.rst +++ b/tutorials/tut0.rst @@ -1,3 +1,5 @@ +.. _tut0: + Tutorial 0 - Get it Running =========================== diff --git a/tutorials/tut1.rst b/tutorials/tut1.rst new file mode 100644 index 000000000..91c8976e1 --- /dev/null +++ b/tutorials/tut1.rst @@ -0,0 +1,245 @@ +.. _tut1: + +Tutorial 1 - The Golden Key +=========================== + +In :ref:`tut0` we created a read-only API with a single endpoint to list todos. There are many directions we can go to make this API more interesting, but one good place to start would be allowing some users to change data in addition to reading it. + +Step 1. Add a Trusted User +-------------------------- + +The previous tutorial created a :code:`web_anon` role in the database with which to execute anonymous web requests. Let's make a role called :code:`todo_user` for users who authenticate with the API. This role will have the authority to do anything to the todo list. + +.. code-block:: postgres + + -- run this in psql using the database created + -- in the previous tutorial + + create role todo_user nologin; + grant todo_user to postgres; + + grant usage on schema api to todo_user; + grant all on api.todos to todo_user; + grant usage, select on sequence api.todos_id_seq to todo_user; + +Step 2. Make a Secret +--------------------- + +Clients authenticate with the API using JSON Web Tokens. These are JSON objects which are cryptographically signed using a password known to only us and the server. Because clients do not know the password, they cannot tamper with the contents of their tokens. PostgREST will detect counterfeit tokens and will reject them. + +Let's create a password and provide it to PostgREST. Think of a nice long one, or use a tool to generate it. + +.. note:: + + The `OpenSSL toolkit `_ provides an easy way to generate a secure password. If you have it installed, run + + .. code-block:: bash + + openssl rand -base64 32 + +Open the :code:`postgrest.conf` (created in the previous tutorial) and add a line with the password: + +.. code-block:: ini + + # add this line to postgrest.conf + + jwt-secret = "" + +If the PostgREST server is still running from the previous tutorial, restart it to load the updated configuration file. + +Step 3. Sign a Token +-------------------- + +Ordinarily your own code in the database or in another server will create and sign authentication tokens, but for this tutorial we will make one "by hand." Go to `jwt.io `_ and fill in the fields like this: + +.. figure:: ../_static/tuts/tut1-jwt-io.png + :alt: jwt.io interface + + How to create a token at https://jwt.io + +Remember to fill in the password you generated rather than the word :code:`secret`. After you have filled in the password and payload, the encoded data on the left will update. Copy the encoded token. + +.. note:: + + While the token may look well obscured, it's easy to reverse engineer the payload. The token is merely signed, not encrypted, so don't put things inside that you don't want a determined client to see. + +Step 4. Make a Request +---------------------- + +Back in the terminal, let's use :code:`curl` to add a todo. The request will include an HTTP header containing the authentication token. + +.. code-block:: bash + + export TOKEN="" + + curl http://localhost:3000/todos -X POST \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"task": "learn how to auth"}' + +And now we have completed all three items in our todo list, so let's set :code:`done` to true for them all with a :code:`PATCH` request. + +.. code-block:: bash + + curl http://localhost:3000/todos -X PATCH \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"done": true}' + +A request for the todos shows three of them, and all completed. + +.. code-block:: bash + + curl http://localhost:3000/todos + +.. code-block:: json + + [ + { + "id": 1, + "done": true, + "task": "finish tutorial 0", + "due": null + }, + { + "id": 2, + "done": true, + "task": "pat self on back", + "due": null + }, + { + "id": 3, + "done": true, + "task": "learn how to auth", + "due": null + } + ] + +Step 4. Add Expiration +---------------------- + +Currently our authentication token is valid for all eternity. As long as the server continues using the same password to verify the JWT signature it will honor this token and use the :code:`todo_user` role to perform requests including it. + +It's better policy to include an expiration timestamp for tokens using the :code:`exp` claim. This is one of two JWT claims that PostgREST treats specially. + ++--------------+----------------------------------------------------------------+ +| Claim | Interpretation | ++==============+================================================================+ +| :code:`role` | The database role under which to execute SQL for API request | ++--------------+----------------------------------------------------------------+ +| :code:`exp` | Expiration timestamp for token, expressed in "Unix epoch time" | ++--------------+----------------------------------------------------------------+ + +.. note:: + + Epoch time is defined as the number of seconds that have elapsed since 00:00:00 Coordinated Universal Time (UTC), January 1st 1970, minus the number of leap seconds that have taken place since then. + +To observe expiration in action, we'll add an :code:`exp` claim of five minutes in the future to our previous token. First find the epoch value of five minutes from now. In psql run this: + +.. code-block:: postgres + + select extract(epoch from now() + '5 minutes'::interval) :: integer; + +Go back to jwt.io and change the payload to + +.. code-block:: json + + { + "role": "todo_user", + "exp": "" + } + +Copy the updated token as before, and save it as a new environment variable. + +.. code-block:: bash + + export NEW_TOKEN="" + +Try issuing this request in curl before and after the expiration time: + +.. code-block:: bash + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $NEW_TOKEN" + +After expiration, the API returns HTTP 401 Unauthorized: + +.. code-block:: json + + {"message":"JWT expired"} + +Bonus Topic: Immediate Revocation +--------------------------------- + +Even with token expiration there are times when you may want to immediately revoke access for a specific token. For instance, suppose you learn that a disgruntled employee is up to no good and his token is still valid. + +To revoke a specific token we need a way to tell it apart from others. Let's add a custom :code:`email` claim that matches the email of the client issued the token. + +Go ahead and make a new token with the payload + +.. code-block:: json + + { + "role": "todo_user", + "email": "disgruntled@mycompany.com" + } + +Save it to an environment variable: + +.. code-block:: bash + + export WAYWARD_TOKEN="" + +PostgREST allows us to specify a stored procedure to run during attempted authentication. The function can do whatever it likes, including raising an exception to terminate the request. + +First make a new schema and add the function: + +.. code-block:: plpgsql + + create schema auth; + grant usage on schema auth to web_anon, todo_user; + + create or replace function auth.check_token() returns void + language plpgsql + as $$ + begin + if current_setting('request.jwt.claim.email', true) = + 'disgruntled@mycompany.com' then + raise insufficient_privilege + using hint = 'Nope, we are on to you'; + end if; + end + $$; + +Next update :code:`tutorial.conf` and specify the new function: + +.. code-block:: ini + + # add this line to postgrest.conf + + pre-request = "auth.check_token" + +Restart PostgREST for the change to take effect. Next try making a request with our original token and then with the revoked one. + +.. code-block:: bash + + # this request still works + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $TOKEN" + + # this one is rejected + + curl http://localhost:3000/todos \ + -H "Authorization: Bearer $WAYWARD_TOKEN" + +The server responds with 403 Forbidden: + +.. code-block:: json + + { + "hint": "Nope, we are on to you", + "details": null, + "code": "42501", + "message": "insufficient_privilege" + }