mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-08 02:24:08 +00:00

apologies to anyone finding this commit via git blame or log run the autoformatting by pre-commit run --all-files
53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
whoami service authentication with the Hub
|
|
"""
|
|
import json
|
|
import os
|
|
from functools import wraps
|
|
from urllib.parse import quote
|
|
|
|
from flask import Flask
|
|
from flask import redirect
|
|
from flask import request
|
|
from flask import Response
|
|
|
|
from jupyterhub.services.auth import HubAuth
|
|
|
|
|
|
prefix = os.environ.get('JUPYTERHUB_SERVICE_PREFIX', '/')
|
|
|
|
auth = HubAuth(api_token=os.environ['JUPYTERHUB_API_TOKEN'], cache_max_age=60)
|
|
|
|
app = Flask(__name__)
|
|
|
|
|
|
def authenticated(f):
|
|
"""Decorator for authenticating with the Hub"""
|
|
|
|
@wraps(f)
|
|
def decorated(*args, **kwargs):
|
|
cookie = request.cookies.get(auth.cookie_name)
|
|
token = request.headers.get(auth.auth_header_name)
|
|
if cookie:
|
|
user = auth.user_for_cookie(cookie)
|
|
elif token:
|
|
user = auth.user_for_token(token)
|
|
else:
|
|
user = None
|
|
if user:
|
|
return f(user, *args, **kwargs)
|
|
else:
|
|
# redirect to login url on failed auth
|
|
return redirect(auth.login_url + '?next=%s' % quote(request.path))
|
|
|
|
return decorated
|
|
|
|
|
|
@app.route(prefix)
|
|
@authenticated
|
|
def whoami(user):
|
|
return Response(
|
|
json.dumps(user, indent=1, sort_keys=True), mimetype='application/json'
|
|
)
|