#!/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' )