Ошибка с oauthlib oauth2 с nginx

Рейтинг: 1Ответов: 0Опубликовано: 13.02.2023

Есть сервер с единственным внешним ip (уже предлагали раскидать по серверам, не подходит такое решение), задача развести приложения flask по доменным именам.

Я уже настроил guicorn и Nginx, но столкнулся с ошибкой google oauth2 при подключенном nginx (без него все прекрасно работает). Возможно ошибка возникает при блокировке некоторых запросов, но это не точно. Пользователь может авторизоваться, но после этого сразу вылетает.

Nginx

server {
    listen 80 default_server;

    server_name _;

    return 301 https://$host$request_uri;
  }
server {
        listen 443 ssl;
        server_name app.ru;
    
        ssl_certificate <путь>/ssl/cert.crt;
        ssl_certificate_key <путь>/ssl/key.pem;
        location / {
            include proxy_params;
            proxy_pass https://unix:<путь>/app.sock;
        }
    }

Service Unit

[Unit]
Description=app
Requires=app.socket
After=network.target
[Service]
Type=simple
User=root
Group=www-data
WorkingDirectory=<путь>
Environment="PATH=<путь>/venv/bin/"
ExecStart=gunicorn --workers 10 --certfile=ssl/cert.crt --keyfile=ssl/key.pem --user limb --group www-data -m 007 --bind unix:app.sock wsgi:app
Restart=always
[Install]
WantedBy=multi-user.target

Socket Unit

[Unit]
Description=socket

[Socket]
User=root
ListenStream=<путь>/app.sock

[Install]
WantedBy=sockets.target

Код Авторизации

@app.route("/login")
def login():
    if not current_user.is_authenticated:
        google_provider_cfg = get_google_provider_cfg()
        authorization_endpoint = google_provider_cfg["authorization_endpoint"]
        request_uri = oauth.prepare_request_uri(
            authorization_endpoint,
            redirect_uri=request.base_url + "/callback",
            scope=["openid", "email", "profile"],
        )
        return redirect(request_uri)
    else:
        return redirect(profile)

@app.route("/login/callback")
def callback():
    if not current_user.is_authenticated:
        code = request.args.get("code")

        google_provider_cfg = get_google_provider_cfg()
        token_endpoint = google_provider_cfg["token_endpoint"]
        token_url, headers, body = oauth.prepare_token_request(
            token_endpoint,
            authorization_response=request.url,
            redirect_url=request.base_url,
            code=code
        )
        token_response = requests.post(
            token_url,
            headers=headers,
            data=body,
            auth=(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET),
        )
        oauth.parse_request_body_response(json.dumps(token_response.json()))

        userinfo_endpoint = google_provider_cfg["userinfo_endpoint"]
        uri, headers, body = oauth.add_token(userinfo_endpoint)
        userinfo_response = requests.get(uri, headers=headers, data=body)
        if userinfo_response.json().get("email_verified"):
            unique_id = userinfo_response.json()["sub"]
            users_email = userinfo_response.json()["email"]
            try:
                picture = userinfo_response.json()["picture"]
            except KeyError:
                picture = "/static/img/default-image.jpg"
            try:
                users_name = userinfo_response.json()["given_name"]
            except KeyError:
                flash("Аккаунт без имени. Регистрация запрещена.")
                return redirect("403")
            try:
                last_name = userinfo_response.json()["family_name"]
            except KeyError:
                flash("Аккаунт без фамилии. Регистрация запрещена.")
                return redirect("403")
        else:
            flash("Почта google не подтверждена. Регистрация запрещена.")
            return redirect("403")

        oauth.parse_request_body_response(json.dumps(token_response.json()))
        new_user = User(google=str(unique_id), username=users_name + ' ' + last_name, email=users_email, profile_img=picture)

        if User.query.filter_by(google=str(unique_id)).first() is None:
            db.session.add(new_user)
            db.session.commit()
            login_user(new_user)
            return redirect(request.url, code=302)
            make_logging("<auth> User sign in")
        else:
            login_user(User.query.filter_by(google=unique_id).first())
            db.session.commit()
            make_logging("<auth> User log in")
            return redirect(request.url, code=302)
    else:
        return redirect(url_for("main"))

Ошибка в логах

    ERROR:app:Exception on /login/callback [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2525, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1822, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1820, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1796, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/home/limb/rossnou_stud_help_freelance/app/routes.py", line 114, in callback
    oauth.parse_request_body_response(json.dumps(token_response.json()))
  File "/usr/local/lib/python3.10/dist-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 427, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/usr/local/lib/python3.10/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 441, in parse_token_response
    validate_token_parameters(params)
  File "/usr/local/lib/python3.10/dist-packages/oauthlib/oauth2/rfc6749/parameters.py", line 448, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/usr/local/lib/python3.10/dist-packages/oauthlib/oauth2/rfc6749/errors.py", line 399, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad Request

Ответы

Ответов пока нет.