Как реализовать аутентификацию в социальных сетях с использованием протокола http - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь реализовать социальную регистрацию в Google локально, используя Flask, Google App Engine и Flask-dance.

Я последовал примеру, предоставленному автором Flask-dance из этой ссылки .

Это основной файл:

from flask import Flask, url_for, redirect
from flask_dance.contrib.google import make_google_blueprint, google
from flask_dance.consumer import oauth_authorized, oauth_error
from werkzeug.contrib.fixers import ProxyFix

app = Flask('application')
app.wsgi_app = ProxyFix(app.wsgi_app)

# You must configure these 3 values from Google APIs console
# https://code.google.com/apis/console
GOOGLE_CLIENT_ID = 'my-client-id'
GOOGLE_CLIENT_SECRET = 'my-client-secret'

app.config["GOOGLE_OAUTH_CLIENT_ID"] = GOOGLE_CLIENT_ID
app.config["GOOGLE_OAUTH_CLIENT_SECRET"] = GOOGLE_CLIENT_SECRET
google_bp = make_google_blueprint(
    client_id=app.config['GOOGLE_OAUTH_CLIENT_ID'],
    client_secret=app.config['GOOGLE_OAUTH_CLIENT_SECRET'],
    redirect_to="index_man_2",
    scope=["https://www.googleapis.com/auth/userinfo.profile",
    "https://www.googleapis.com/auth/userinfo.email"]
)

app.register_blueprint(google_bp, url_prefix="/login")


@app.route("/login-gmail")
def index_gmail():
    if not google.authorized:
        return redirect(url_for("google.login"))
    resp = google.get("/oauth2/v1/userinfo")
    assert resp.ok, resp.text
    return "ok"

Когда я получаю доступ к http://localhost:8080/login-gmail,, сервер перенаправляет меня, чтобы выбрать страницу аккаунта Google.Затем, когда я выбираю учетную запись, я получаю эту ошибку:

INFO 2019-07-11 14: 47: 13,476 module.py:861] default: "GET / login / google HTTP / 1.1«302 989 ПРЕДУПРЕЖДЕНИЕ 2019-07-11 14: 47: 21,345 urlfetch_stub.py:575] Удаление запрещенных заголовков из запроса URLFetch: ['Content-Length'] ПРЕДУПРЕЖДЕНИЕ 2019-07-11 13: 47: 21,828 connectionpool.py:403] Не удалось проанализировать заголовки (url = https://accounts.google.com:443/o/oauth2/token): ожидаемый httplib.Message, полученный. Трассировка (последний последний вызов): файл "C: \ Users \ tah \ Documents \ some-name \ m \ src \ lib \urllib3 \ connectionpool.py ", строка 399, в _make_request assert_header_parsing (httplib_response.msg) Файл" C: \ Users \ Tah \ Documents \ some-name \ m \ src \ lib \ urllib3 \ util \ response.py ", строка 56, в assert_header_parsing type (headers))) TypeError: ожидаемый httplib.Message, полученный.сообщение об ошибке: EXCEPTION IN (1982, ('Соединение разорвано: IncompleteRead (чтение 35 байт)', IncompleteRead (чтение 35 байтов))) ('Соединение разорвано: IncompleteRead (чтение 35 байт)', IncompleteRead (чтение 35 байт)) INFO2019-07-11 13: 47: 21,884 recording.py:676] Сохранено;ключ: appstats : 041000, часть: 455 байтов, полная: 18063 байта, служебные данные: 0,000 + 0,012;ссылка: http://localhost:8080/_ah/stats/details?time=1562852841009 INFO
2019-07-11 14: 47: 21895 module.py:861] по умолчанию: «GET / Войти / Google / уполномоченный государственный = sfUHmqfKiy61fnvh1UUsVydJv3vO5L и код = 4% 2FgwHWN8roL2HIxqxtBoFKySXod_jErJ0NB7ofNpdFtLwS2Zebc2rx959sPDOvUThrdlKfQEKWAj0bEbtJxBsskao и сфера = электронная почта + профиль+ https% 3A% 2F% 2Fwww.googleapis.com% 2Fauth% 2Fuserinfo.profile + https% 3A% 2F% 2Fwww.googleapis.com% 2Fauth% 2Fuserinfo.«500 41241

С этот ответ , я понимаю, что если Flask-Dance генерирует URL перенаправления с использованием HTTP, это означает, что Flask считает, что входящий запрос использует HTTP.Если входящий запрос на самом деле использует HTTPS, то Flask где-то запутывается, в основном из-за прокси.Но этот ответ не сказал нам, как исправить ошибку.

Спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Я предполагаю, что вы определили эти переменные окружения в app.yaml:

env_variables:
  OAUTH_INSECURE_TRANSPORT: '1'
  OAUTHLIB_INSECURE_TRANSPORT: '1'

Чтобы исправить вашу проблему, вам нужно использовать инструментальный пояс запросов .Инструментальный пояс поставляется с несколькими различными транспортными адаптерами для использования с запросами.

Сначала вам необходимо установить библиотеку:

pip install -t lib requests-toolbelt

Затем вам нужно добавить следующие строки в основной файл:

import requests_toolbelt.adapters.appengine
# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

Итак, основной файл будет похож на этот:

from flask import Flask, url_for, redirect
from flask_dance.contrib.google import make_google_blueprint, google
from flask_dance.consumer import oauth_authorized, oauth_error
import requests_toolbelt.adapters.appengine

app = Flask('application')
# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

# You must configure these 3 values from Google APIs console
# https://code.google.com/apis/console
GOOGLE_CLIENT_ID = 'my-client-id'
GOOGLE_CLIENT_SECRET = 'my-client-secret'
#...
0 голосов
/ 25 июля 2019

Библиотека werkzeug , от которой зависит Flask, недавно обновилась до версии 0.15.В версии 0.15 было несколько обратно несовместимых изменений, включая изменения в промежуточном программном обеспечении ProxyFix .Из примера кода, который вы опубликовали, видно, что вы импортируете и используете его так, как это работает для werkzeug 0.14, но вам нужно будет внести некоторые изменения для 0.15.Вот что вы должны сделать вместо этого:

from werkzeug.middleware.proxy_fix import ProxyFix


app = Flask('application')
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1)
...