Ошибка с oauthlib oauth2 с nginx
Есть сервер с единственным внешним 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
Источник: Stack Overflow на русском