Commit b7db3987 authored by Barbora Kompišová's avatar Barbora Kompišová
Browse files

create user with OAuth

parent f3b36316
Loading
Loading
Loading
Loading
+37 −5
Original line number Diff line number Diff line
import logging

from flask import Blueprint, Flask, Config, url_for, request, redirect, session, jsonify, \
    make_response
from flask_oauthlib.client import OAuth, OAuthRemoteApp

from portal import oauth
from portal.database.models import User
from portal.service import service

log = logging.getLogger(__name__)


def extract_user_info(me: dict) -> dict:
@@ -32,16 +38,41 @@ def create_gitlab_app(oauth: OAuth) -> OAuthRemoteApp:


gitlab = create_gitlab_app(oauth=oauth)
oauth = Blueprint('oauth', __name__, url_prefix='/oauth')
oauth_blueprint = Blueprint('oauth', __name__, url_prefix='/oauth')


@oauth.route('/login', methods=['GET'])
@oauth_blueprint.route('/login', methods=['GET'])
def oauth_login():
    callback = url_for('oauth.oauth_authorized', _external=True, _scheme='https')
    return gitlab.authorize(callback=callback)


@oauth.route('/login/authorized', methods=['GET'])
def user_oauth_login(user):
    pass


def user_oauth_register(user_info):
    new_user = User(
        uco=None,
        email=user_info['email'],
        username=user_info['username'],
        is_admin=False
    )
    new_user.name = user_info['name']
    service.write_entity(new_user)
    log.debug(f"Created user={new_user}")


def user_login(user_info):
    user = User.query.find_by(username=user_info['user_name'])
    if not user:
        return user_oauth_register(user_info)
    resp = make_response(redirect(oauth.app.config.get('FRONTEND_URL')))
    resp.set_cookie('user_name', user.username)
    return resp


@oauth_blueprint.route('/login/authorized', methods=['GET'])
def oauth_authorized():
    resp = gitlab.authorized_response()
    if resp is None:
@@ -54,8 +85,9 @@ def oauth_authorized():
    session['gitlab_token'] = (token, '')
    me = gitlab.get('/api/v4/user')
    user_info = extract_user_info(me.data)
    data = dict(data=me.data, token=token)
    return jsonify(data)
    login = user_login(user_info)
    login.set_cookie('gitlab_token', token)
    return login


@gitlab.tokengetter
+1 −1
Original line number Diff line number Diff line
@@ -140,7 +140,7 @@ class UserList(Resource):
        admin = data.get('is_admin') or False
        new_user = User(uco=data['uco'], email=data['email'], username=data['username'], is_admin=admin)
        service.write_entity(new_user)
        log.debug(f"Created user={User}")
        log.debug(f"Created user={new_user}")
        return user_schema.dump(new_user)[0], 201


+2 −2
Original line number Diff line number Diff line
@@ -25,8 +25,8 @@ def register_blueprints(app):
    app.register_blueprint(projects, url_prefix=f"{api_prefix}/courses/<string:cid>/projects")
    app.register_blueprint(submissions, url_prefix=f"{api_prefix}/submissions")
    app.register_blueprint(auth, url_prefix=f"{api_prefix}/auth")
    from portal.rest.auth.gitlab import oauth
    app.register_blueprint(oauth)
    from portal.rest.auth.gitlab import oauth_blueprint
    app.register_blueprint(oauth_blueprint, url_prefix=f"{api_prefix}/oauth")


def setup_application():