Commit Graph

93 Commits

Author SHA1 Message Date
Min RK
58dccdb59b jupyterhub-singleuser as a Jupyter Server 2.0 extension
mostly a copy (fork) of singleuser app
using public APIs instead of lots of patching.

opt-in via `JUPYTERHUB_SINGLEUSER_EXTENSION=1`

related changes:

- stop running a test single-user server in a thread. It's complicated and fragile.
  Instead, run it normally, and get the info we need from a custom handler registered via an extension
  via the `full_spawn` fixture
2023-02-02 16:14:06 +01:00
pre-commit-ci[bot]
865d5f7646 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2022-11-16 14:53:12 +00:00
Min RK
63c391641a set stacklevel for oauth_scopes deprecation warning
so it's visible where the deprecated API is called
2022-10-05 18:49:32 -07:00
Min RK
dfc2d4d4f1 Merge remote-tracking branch 'origin/main' into oauth_config 2022-08-02 13:53:51 +02:00
Min RK
e4e4bf5ff4 next release is 3.0, not 2.4 2022-07-29 15:35:08 +02:00
Min RK
b9c83cf7ab allow HubAuth to be async
Switches requests to tornado AsyncHTTPClient instead of requests

For backward-compatibility, use opt-in `sync=False` arg for all public methods that _may_ be async

When sync=True (default), async functions still used, but blocking via ThreadPool + asyncio run_until_complete
2022-07-09 16:45:41 -07:00
Min RK
225ace636a call client-allowed scopes JUPYTERHUB_OAUTH_CLIENT_ALLOWED_SCOPES 2022-07-08 10:18:59 -07:00
Min RK
62b38934e5 store scopes on oauth clients, too
rather than roles, matching tokens

because oauth clients are mostly involved with issuing tokens,
they don't have roles themselves (their owners do).

This deprecates the `oauth_roles` config on Spawners and Services, in favor of `oauth_allowed_scopes`.

The ambiguously named `oauth_scopes` is renamed to `oauth_access_scopes`.
2022-06-08 12:26:48 +02:00
Min RK
7a9778249f run pre-commit with isort 2022-03-31 12:33:26 +02:00
Min RK
27cb56429b HubAuth.get_token returns oauth token stored in cookie
Useful for backend services that want to use the user's token.

Added `in_cookie` bool argument to exclude cookies (previous behavior),
since notebook servers do some things differently when auth is in query param or header vs cookies
2022-03-01 09:43:01 +01:00
Min RK
ccfee4d235 use outermost proxied entry when checking for browser protocol
wee care about what the browser sees, so trust the outermost entry instead of the innermost

This is not secure _in general_, in that these values can be spoofed by malicious proxies,
but for CORS and cookie purposes, we only care about what the browser sees,
however many hops there may be.

A malicious proxy in the chain here isn't a concern because what matters is the immediate
hop from the _browser_, not the immediate hop from the _server_.
2022-01-07 14:03:11 +01:00
Min RK
db3b2d8961 refine service auth docs
favor HubOAuth, as that should really be the default for most services

- Remove some outdated 'new in' text
- Remove docs for some deprecated features (hub_users, hub_groups)
- more detail on what's required
2021-11-30 10:48:53 +01:00
Min RK
cd8dd56213 Revert "store tokens passed via url or header, not only url."
This reverts commit 53c3201c17.

Only tokens in URLs should be persisted in cookies.
Tokens in headers should not have any effect on cookies.
2021-11-04 15:03:12 +01:00
Erik Sundell
d6c48b15fe pyupgrade: run pyupgrade --py36-plus and black on all but tests 2021-08-26 16:23:38 +02:00
Martynov Maxim
60b13224c5 Merge branch 'main' into allow_all 2021-07-05 14:43:02 +03:00
Martynov Maxim
c7c9990c3d Fix allow_all check 2021-06-23 14:47:05 +03:00
IvanaH8
12ffc42114 Fix docstring indentation and reference to flask example in docs
example using flask for Implementing your own Auth with JupyterHub was not displayed
2021-06-18 11:07:33 +02:00
0mar
7a3b237bb3 Refactored scope names and updated docs to reflect this 2021-06-15 13:00:15 +02:00
Min RK
fbea31d00a support groups in _intersect_scopes
Requires db resolution
2021-06-08 09:35:45 +02:00
Min RK
40de16e0e1 Update service examples and documentation with access scopes and roles 2021-06-07 14:02:13 +02:00
Min RK
e2076e6c91 implement access scopes
- access:services for services
- access:users:servers for servers
- tokens automatically have access to their issuing client (if their owner does, too)
- Check access scope in HubAuth integration
2021-06-07 14:00:50 +02:00
Min RK
863b4c7d50 Deprecate and remove some old auth bits
- remove long-deprecated `POST /api/authorizations/token` for creating tokens
- deprecate but do not remove `GET /api/authorizations/token/:token` in favor of GET /api/user
- remove shared-cookie auth for services from HubAuth, rely on OAuth for browser-auth instead
- use `/hub/api/user` to resolve user instead of `/authorizations/token` which is now deprecated
2021-05-05 14:07:14 +02:00
Matthias Bussonnier
a71823c5ab DOC: Conform to numpydoc.
Minor syntax update
2021-04-18 21:23:03 -07:00
Min RK
1b12107c54 specify that mock.patch is temporary
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-02-01 07:05:24 +00:00
Min RK
d3147f3fb7 make_singleuser_app: patch-in HubAuthenticatedHandler at lower priority
apply patch directly to BaseHandler instead of each handler instance
so that overrides can still take effect (i.e. APIHandler raising 403 instead of redirecting)
2021-01-29 14:07:05 +01:00
Min RK
28fdbeb0c0 update back pre-commit hook
specify minimum target_version as py36

results in some churn
2020-11-30 10:13:10 +01:00
Erik Sundell
e1166ec834 Replace @gen.coroutine/yield with async/await 2020-11-11 14:36:56 +01:00
Greg
560bab395b update based on pr suggestion
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:16:57 -04:00
Greg
c68b846eef get error key or error_description key if not available
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:12:18 -04:00
Greg
5896b2c9f7 get error description from error key vs error_description key
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:12:18 -04:00
Min RK
cc8e780653 rename white/blacklist allowed/blocked
- group_whitelist -> allowed_groups

still todo: handle deprecated signatures in check_whitelist methods while preserving subclass overrides
2020-06-15 14:40:44 +02:00
Karthikeyan Singaravelan
f3b1b5c7a6 Fix DeprecationWarning in escape sequences. 2019-10-19 20:25:07 +05:30
Félix-Antoine Fortin
e9c78422b5 Define default values for HubAuth ssl traitlets
The default values are taken from environment variables defined by Spawner.get_env.
2019-05-27 14:12:39 -04:00
Min RK
c58a251dbd typo raising error on missing oauth state
need to specify a status code
2019-04-01 14:53:35 +02:00
Min RK
5e60582ef3 run autoformat
apologies to anyone finding this commit via git blame or log

run the autoformatting by

    pre-commit run --all-files
2019-02-19 17:00:10 +01:00
chang-zhijie
53c3201c17 store tokens passed via url or header, not only url. 2018-12-11 17:00:16 +08:00
Min RK
7f1c91d8f4 Clear the auth cache when testing the same url twice with different results 2018-11-12 14:35:47 +01:00
Min RK
3a0bacde3a HubAuth: allow caching None responses
when a token doesn't identify a user, the response is None.
These results are cached, but the cache checked for `is None`,
causing failed-auth responses to effectively not be cached.
2018-11-12 12:56:41 +01:00
Min RK
f29354e0f4 Merge branch 'master' into end-to-end-ssl 2018-10-02 11:15:53 +02:00
Min RK
df74ff68ab better error messages on oauth errors 2018-09-10 17:12:08 +02:00
Thomas Mendoza
c50cd1ba7f Propagate certs to everything that needs them 2018-07-18 16:02:57 -07:00
Min RK
e374e93cfb expose cookie options and pass them down to spawners
enables forcing all-session cookies with:

```python
c.JupyterHub.tornado_settings['cookie_options'] = {
    'expires_days': None,
}
```
2018-03-23 10:38:50 +01:00
Min RK
9866a0fadc avoid raising HTTPError in get_current_user
it can cause issues, e.g. with upcoming notebook releases .get_current_user may be called in set_default_headers,
which doesn't catch HTTPErrors.
2018-01-03 14:58:42 +01:00
Min RK
e9123f55e0 make HubAuth a singleton
allows cache re-use in default case

otherwise, default behavior is to instantiate anew on each request, eliminating cache
2017-12-11 14:20:25 +01:00
Min RK
ee004486bd include session id in cache key
if session id is defined, clearing the session id clears the cache,
allowing immediate revocation of tokens by the Hub.
2017-12-11 14:20:25 +01:00
Min RK
498e234c37 add cache repr for debugging 2017-12-11 14:20:25 +01:00
Min RK
24ff91eef5 avoid oauth state cookie collisions
in case of multiple simultaneous

- state arg is strictly required now
- default cookie name in case of no collision is unchanged
- in case of collision, randomize cookie name with a suffix and store cookie_name in state
- expire state cookies after 10 minutes, not 1 day
2017-09-21 14:32:47 +02:00
Min RK
f84a88da21 fix oauth state redirect
check for HubOAuth, not HubOAuthenticated
2017-09-14 16:06:36 +02:00
Min RK
eecec7183e fix clearing of oauth state cookie
missing path arg
2017-09-14 16:01:34 +02:00
Min RK
5e4b935322 only HubOAuth can set token cookie 2017-08-31 16:04:54 +02:00