Встраиваемая регистрация Meta Facebook в Django Python
Я работаю в компании, которая работает с чатботом Whatsapp. Я создал страницу, чтобы наши клиенты регистрировались с помощью своего бизнес-аккаунта в facebook для получения прав на отправку сообщений от их имени. Я реализую встроенную регистрацию на простой странице, чтобы получить токен доступа. Для тестирования я создал простой бэкэнд на python, чтобы возвращать токен доступа на страницу.
Вот коды, которые у меня есть: (я просто заменил идентификаторы на xxx, yyy и zzz, потому что думаю, что они здесь не нужны)
Frontend
Backend
from flask import Flask, request, jsonify
from flask_cors import CORS
import requests
app = Flask(__name__)
CORS(app)
@app.route('/get-access-token', methods=['POST'])
def get_access_token():
data = request.get_json()
code = data.get('code')
if not code:
return jsonify({'error': 'No code provided'}), 400
app_id = 'XXX'
app_secret = 'XXX'
url = f'https://graph.facebook.com/v17.0/oauth/access_token?client_id={app_id}&client_secret={app_secret}&code={code}'
response = requests.get(url)
if response.status_code == 200:
print(jsonify(response.json()))
return jsonify(response.json())
else:
return jsonify({'error': 'Failed to get access token', 'details': response.json()}), response.status_code
if __name__ == '__main__':
app.run(port=5000)
Это работает нормально, когда я обслуживаю фронт командой http-server
и запускаю бэкэнд.
Я тоже использую ngrok
. С его помощью я могу использовать URL (с https) в своих конфигурациях приложений в системе Meta'. Я поместил его в Allowed Domains for the JavaScript SDK (в разделе Facebook Login for Business) и в Domain manager (в разделе App Settings -> Advanced). Это означает, что когда пользователь нажимает на кнопку "Войти с помощью Facebook", открывается всплывающее окно. Если пользователь закрывает всплывающее окно, то он вызывает обратный вызов в FB.login
и получает ответ {authResponse: null, status: 'unknown'}
, который заставляет программу записать в консоль "Пользователь отменил вход или не полностью авторизовался". Если же пользователь завершает авторизацию, он обращается к бэкенду, и я получаю токен доступа.
Проблема в том, что когда я пытаюсь "перенести" этот код в Django, вызывается функция обратного вызова в FB.login
, которая возвращает {authResponse: null, status: 'unknown'}
в ответ, когда появляется окно для входа в систему, и игнорирует все, что я делаю после этого (например, закрываю окно или завершаю вход в систему).
Я обратился к chatGPT, и вкратце он предложил следующее:
Добавьте URL-адрес вашего ngrok в ALLOWED_HOSTS.
Добавьте URL ngrok в CSRF_TRUSTED_ORIGINS.
Проверьте настройки SESSION_COOKIE_SECURE и CSRF_COOKIE_SECURE.
Установите SECURE_PROXY_SSL_HEADER для работы с HTTPS-прокси.
Дважды проверьте настройки приложения Facebook, особенно URI перенаправления.
Посмотрите вкладку "Сеть" браузера для получения подробной информации о неудачных запросах.
Похоже, что Django каким-то образом вмешивается в процесс входа в систему, но не уверен, как и почему.
Есть идеи?