aboutsummaryrefslogtreecommitdiff
path: root/gn2/wqflask/oauth2/checks.py
blob: 9a633b9540d6a322a8ee7fac53d7869cf45d1d72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""Various checkers for OAuth2"""
from functools import wraps
from urllib.parse import urljoin

from authlib.integrations.requests_client import OAuth2Session
from flask import (
    flash, request, redirect, session as flask_session)

from . import session
from .client import (
    authserver_uri, oauth2_clientid, oauth2_clientsecret, oauth2_get)
from .session import clear_session_info


def require_oauth2(func):
    """Decorator for ensuring user is logged in."""
    @wraps(func)
    def __token_valid__(*args, **kwargs):
        """Check that the user is logged in and their token is valid."""
        config = current_app.config
        def __clear_session__(_no_token):
            session.clear_session_info()
            flask_session.pop("oauth2_token", None)
            flask_session.pop("user_details", None)
            flash("You need to be logged in.", "alert-warning")
            return redirect("/")

        def __with_token__(token):
            client = OAuth2Session(
                oauth2_clientid(), oauth2_clientsecret(), token=token)
            resp = client.get(
                urljoin(authserver_uri(), "auth/user/"))
            user_details = resp.json()
            if not user_details.get("error", False):
                return func(*args, **kwargs)

            return clear_session_info(token)

        return session.user_token().either(__clear_session__, __with_token__)

    return __token_valid__