Встраиваемая регистрация 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, и вкратце он предложил следующее:

  1. Добавьте URL-адрес вашего ngrok в ALLOWED_HOSTS.

  2. Добавьте URL ngrok в CSRF_TRUSTED_ORIGINS.

  3. Проверьте настройки SESSION_COOKIE_SECURE и CSRF_COOKIE_SECURE.

  4. Установите SECURE_PROXY_SSL_HEADER для работы с HTTPS-прокси.

  5. Дважды проверьте настройки приложения Facebook, особенно URI перенаправления.

  6. Посмотрите вкладку "Сеть" браузера для получения подробной информации о неудачных запросах.

Похоже, что Django каким-то образом вмешивается в процесс входа в систему, но не уверен, как и почему.

Есть идеи?

Вернуться на верх