From ef9656eb8b501775bfc5b703985cecf73cdc70e0 Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 27 May 2016 16:11:37 +0200 Subject: [PATCH] add example service --- examples/service-whoami/README.md | 20 ++++++ examples/service-whoami/jupyterhub_config.py | 6 ++ examples/service-whoami/launch.sh | 12 ++++ examples/service-whoami/whoami.png | Bin 0 -> 36016 bytes examples/service-whoami/whoami.py | 61 +++++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 examples/service-whoami/README.md create mode 100644 examples/service-whoami/jupyterhub_config.py create mode 100644 examples/service-whoami/launch.sh create mode 100644 examples/service-whoami/whoami.png create mode 100644 examples/service-whoami/whoami.py diff --git a/examples/service-whoami/README.md b/examples/service-whoami/README.md new file mode 100644 index 00000000..a039c529 --- /dev/null +++ b/examples/service-whoami/README.md @@ -0,0 +1,20 @@ +# Authenticating a service with JupyterHub + +Uses `jupyterhub.services.HubAuthenticated` to authenticate requests with the Hub. + +## Run + +1. Launch JupyterHub and the `whoami service` with `source launch.sh`. +2. Visit http://127.0.0.1:8000/hub/whoami + +After logging in with your local-system credentials, you should see a JSON dump of your user info: + +```json +{ + "admin": false, + "last_activity": "2016-05-27T14:05:18.016372", + "name": "queequeg", + "pending": null, + "server": "/user/queequeg" +} +``` diff --git a/examples/service-whoami/jupyterhub_config.py b/examples/service-whoami/jupyterhub_config.py new file mode 100644 index 00000000..c123ac88 --- /dev/null +++ b/examples/service-whoami/jupyterhub_config.py @@ -0,0 +1,6 @@ +from getpass import getuser +import os + +c.JupyterHub.api_tokens = { + os.environ['WHOAMI_HUB_API_TOKEN']: getuser(), +} diff --git a/examples/service-whoami/launch.sh b/examples/service-whoami/launch.sh new file mode 100644 index 00000000..241486e9 --- /dev/null +++ b/examples/service-whoami/launch.sh @@ -0,0 +1,12 @@ +# make some API tokens, one for the proxy, one for the service +export CONFIGPROXY_AUTH_TOKEN=`openssl rand -hex 32` +export WHOAMI_HUB_API_TOKEN=`openssl rand -hex 32` + +# start JupyterHub +jupyterhub --no-ssl --ip=127.0.0.1 & + +# give JupyterHub a moment to start +sleep 2 + +# start the whoami service as /hub/whoami +python whoami.py diff --git a/examples/service-whoami/whoami.png b/examples/service-whoami/whoami.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a33584cbb877778ffdcb2db1570f1eb15013a4 GIT binary patch literal 36016 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 xw)@WiCPz2wzTVQ$?Q|49inw8Ue{T