google oauth 2.0 redirect_uri_mismatch (aws ec2 + route53 + nginx + uwgsi + flask + socketio)

Я получаю redirect_uri_mismatch всякий раз, когда пытаюсь использовать Google OAuth 2.0 на своем веб-сайте. Я использую aws ec2 + route53 + nginx + uwgsi + flask + socketio

Авторизованные URI перенаправления: пришлось добавить круглые скобки, чтобы удалить ссылку.

  • (http)://example.net/auth/oauth2callback
  • (http)s://example.net/auth/oauth2callback
  • (http)://www.example.net/auth/oauth2callback
  • (http)s://www.example.net/auth/oauth2callback
  • (http)://localhost/auth/oauth2callback
  • (http)s://localhost/auth/oauth2callback

Я также добавил завершающий «/», но, похоже, это ничего не исправляет. Я подозреваю, что это проблема с настройкой сервера nginx или какая-то проблема с подключением между nginx -> uwsgi -> flask, поскольку URI перенаправления, о котором мне сообщает страница с ошибкой Google, точно соответствует URI, которые я указал в настройках OAuth Google.

Вот конфигурация моего сервера nginx:

server {
    listen 80;
    server_name www.example.net;

    return 301 http://example.net;
}

server {
    listen 80;
    server_name example.net;

    return 301 https://example.net;
}

server {
    listen 443;
    server_name example.net;

    ssl on;
    ssl_certificate /certs.pem;
    ssl_certificate_key /private.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers BLANK;
    ssl_session_cache shared:SSL:50m;
    ssl_dhparam /dhparam.pem;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000";

    client_max_body_size 5M;

    location / {
        include uwsgi_params;

        uwsgi_pass unix:/filename.sock;
    }
}

Я просмотрел много документов по этому поводу. Большинство людей используют прокси, и им пришлось добавить несколько строк в конфигурацию сервера, чтобы справиться с этой проблемой, но, поскольку я их не использую, я считаю, что мне не нужно помещать какие-либо из них в мою конфигурацию. (На всякий случай я попробовал несколько решений, но, похоже, они все еще не исправили это.)

Без использования nginx и uwsgi мне удалось заставить функцию OAuth работать на локальном хосте.

Заранее спасибо!

Изменить--
@TarunLalwani Итак, я сделал это наполовину с помощью proxy_pass. Только добавив proxy_pass и ничего больше, я могу попасть на страницу входа в Google OAuth. Но как только я авторизую вход, он перенаправит пользователя обратно на 127.0.0.1:5000 (это то, что я установил для proxy_pass). Я думаю, что мне нужно сделать некоторые настройки обратного прокси. Что я добавил в блок местоположения сразу после proxy_pass:

proxy_redirect off;
proxy_buffering off;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

Теперь обратный прокси-сервер, кажется, работает, так как OAuth снова не работает. Но OAuth 2.0 перенаправляет пользователя на http:example.net/auth/oauth2callback вместо http:127.0.0.1:5000/auth/oauth2callback

Я тестировал, добавляя каждую командную строку за строкой и перезапуская сервер. Перед добавлением proxy_set_header Host $host; я получаю http://127.0.0.1:5000/auth/oauth2callback в качестве URI перенаправления и получаю http://example.net/auth/oauth2callback при добавлении этой строки. Может быть, причина, по которой OAuth не работает, заключается в том, что пользователь перенаправляется на http://example.net/auth/oauth2callback вместо https://example.net/auth/oauth2callback?

Редактировать 2 --
Выполняя curl -v https://example.net/auth/oauth2callback, я получаю следующее:

*   Trying my.ip...
* Connected to example.net (my.ip) port 443 (#0)
* found 173 certificates in certs
* found 696 certificates in certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
*        server certificate verification OK
*        server certificate status verification SKIPPED
*        common name: example.net (matched)
*        server certificate expiration date OK
*        server certificate activation date OK
*        certificate public key: RSA
*        certificate version: #3
*        subject: CN=example.net
*        start date: Sun, 10 Sep 2017 22:18:00 GMT
*        expire date: Sat, 09 Dec 2017 22:18:00 GMT
*        issuer: C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
*        compression: NULL
* ALPN, server accepted to use http/1.1
> GET /auth/oauth2callback HTTP/1.1
> Host: feelsbadman.net
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 302 FOUND
< Server: nginx/1.10.3 (Ubuntu)
< Date: Tue, 12 Sep 2017 07:32:36 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 819
< Connection: keep-alive
< Location: https://accounts.google.com/o/oauth2/auth?client_id=myid-asdfasdfasdf.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.net%2Fauth%2Foauth2callback&scope=email&access_type=offline&response_type=code&include_granted_scopes=true
< Strict-Transport-Security: max-age=31536000
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
* Connection #0 to host example.net left intact
<p>You should be redirected automatically to target URL: <a href="https://accounts.google.com/o/oauth2/auth?client_id=myid-asdfasdfasdf.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.net%2Fauth%2Foauth2callback&scope=email&access_type=offline&response_type=code&include_granted_scopes=true">https://accounts.google.com/o/oauth2/auth?client_id=myid-asdfasdfasdf.apps.googleusercontent.com&redirect_uri=http://example.net/auth/oauth2callback&scope=email&access_type=offline&response_type=code&include_granted_scopes=true</a>.

person D_Pain    schedule 11.09.2017    source источник
comment
Вы пытались установить proxy_set_header X-Forwarded-Host $host; в своем блоке location /?   -  person wkl    schedule 11.09.2017
comment
@birryree Да, я пытался поставить его прямо перед uwsgi_pass :(   -  person D_Pain    schedule 11.09.2017
comment
Можете ли вы проверить в браузере, какой возвращаемый URL-адрес возвращается?   -  person Tarun Lalwani    schedule 11.09.2017
comment
@TarunLalwani Да, браузер возвращает: URI перенаправления в запросе, https://example.net/auth/oauth2callback, не соответствует тем, которые разрешены для клиента OAuth.   -  person D_Pain    schedule 12.09.2017
comment
Можете ли вы добавить что-то одно за раз. Например, просто добавьте Nginx и proxy_pass в flask и посмотрите, работает ли он. Затем сделайте это через uwsgi и посмотрите, работает ли это. Попробуйте потренироваться в проблемной зоне   -  person Tarun Lalwani    schedule 12.09.2017
comment
@TarunLalwani Эй, я попробовал то, что вы рекомендовали, и обновил исходный пост.   -  person D_Pain    schedule 12.09.2017
comment
Это можно исправить, добавив proxy_redirect http://127.0.0.1:5000 https://example.net   -  person Tarun Lalwani    schedule 12.09.2017
comment
@TarunLalwani Так что я думаю, что проблема не в URI перенаправления. В настройках Google OAuth разрешены как http, так и https. Мне удалось перенаправить его на https, но я все равно получаю ошибку :(   -  person D_Pain    schedule 12.09.2017
comment
Можете ли вы выполнить curl -v https://example.net/auth/oauth2callback и посмотреть, какой результат вы получите?   -  person Tarun Lalwani    schedule 12.09.2017
comment
@TarunLalwani Я обновил сообщение выводом. Это действительно не дает подсказки для решения. Я очень ценю вашу помощь.   -  person D_Pain    schedule 12.09.2017
comment
Это на самом деле дало много намеков на самом деле. Ваш сайт — https://, а ваш обратный URL — http://example.net/auth/oauth2callback и отклонен. Убедитесь, что обратный URL, отправленный в Google, https://example.net/auth/oauth2callback и он установлен таким же в Authorized Redirect URI   -  person Tarun Lalwani    schedule 12.09.2017
comment
@TarunLalwani Спасибо, что помогли! Наконец-то я починил :D   -  person D_Pain    schedule 13.09.2017


Ответы (1)


Ваш сайт https://example.net, а ваш обратный URL-адрес выглядит как http://example.net/auth/oauth2callback и отклонен.

Убедитесь, что в Google отправлен обратный URL https://example.net/auth/oauth2callback и он устанавливается таким же в URI авторизованного перенаправления

person Tarun Lalwani    schedule 13.09.2017