Процесс аутентификации Facebook и Google отменен с использованием Djoser в структуре Django Rest с Next.js + React в качестве внешнего интерфейса

Я использовал Djoser для обработки основных функций аутентификации пользователей в Django Rest Framework. И я попытался использовать его конечную точку социальной авторизации. Согласно его документации, если я правильно понимаю, я сначала добавил redirect_uri в его конечная точка, например :

http://127.0.0.1:8000/auth/o/facebook/?redirect_uri=http://localhost:3000

Все работало нормально. Затем я использовал ссылку для аутентификации, и она вернула мне код и состояние (как данные в приведенном ниже коде) в качестве запросов в redirect_uri. Но затем, когда я отправляю код и состояние в методе getInitialProps с сервера Next.js на свой бэкэнд,

const authResponse = await axios.post(`http://127.0.0.1:8000/user_info/o/facebook/`,data,{
      headers:{
          'Content-Type':'application/x-www-form-urlencoded'
      }
}

Django возвращает код состояния 400. Затем я использовал почтальона для проверки кода публикации и состояния с помощью 'Content-Type':'application/x-www-form-urlencoded', он отображался в окне:

{
    "non_field_errors": [
        "Authentication process canceled"
    ]
}

Я попробовал тот же случай с Google OAuth2. Ниже приведен код Python в моем settings.py.

import os
from dotenv import load_dotenv

load_dotenv()

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG = True

ALLOWED_HOSTS = ['127.0.0.1','0.0.0.0']

INSTALLED_APPS = [
    ...
    'djoser',
    'social_django',
    'rest_framework',
    'rest_framework.authtoken',
    'corsheaders',
    'user_info',
    ...
]

...

CORS_ORIGIN_WHITELIST = [
    "http://localhost:3000",
]

ROOT_URLCONF = 'myprojectname.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

...

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication'
    ),
    'DEFAULT_PERMISSIONS_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

...

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
    "djoser.social.backends.facebook.FacebookOAuth2Override",
    "social_core.backends.google.GoogleOAuth2"
]

SOCIAL_AUTH_FACEBOOK_KEY = os.getenv('FACEBOOK_APP_ID')
SOCIAL_AUTH_FACEBOOK_SECRET = os.getenv("FACEBOOK_SECRET_KEY")

SOCIAL_AUTH_FACEBOOK_SCOPE = ["email"]
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {"fields": "id, name, email"}

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.getenv('GOOGLE_APP_ID')
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.getenv("GOOGLE_SECRET_KEY")

SOCIAL_AUTH_RAISE_EXCEPTIONS = False

DJOSER ={
    "LOGIN_FIELD": "email",
    "USER_CREATE_PASSWORD_RETYPE":True,
    "SEND_ACTIVATION_EMAIL": True,
    "ACTIVATION_URL":f'{os.getenv("FRONTEND_URL")}/activate/'+'{uid}/{token}',
    "SERIALIZERS": {
        'user_create':'user_info.serializers.UserCreateSerializer',
        'user':"user_info.serializers.UserCreateSerializer"
    },
    "SOCIAL_AUTH_ALLOWED_REDIRECT_URIS": [os.getenv("FRONTEND_URL")],
}

AUTH_USER_MODEL = 'user_info.User'

...

Я установил только свои домены приложений как localhost и URL-адрес сайта как http://localhost:8000/ в консоли разработчика Facebook.

Могу ли я избавиться от процесса аутентификации отменен и успешно получить токен? Большое спасибо!!!!


person ken cheung    schedule 01.03.2020    source источник
comment
Удалось ли вам это решить? Это может быть связано с github.com/sunscrapers/djoser/issues/403   -  person Adrian Gonzalez    schedule 02.07.2020
comment
Может ли этот учебник немного помочь? hvitis.dev/   -  person Hvitis    schedule 18.10.2020


Ответы (1)


У меня такая же проблема, и я смог решить эту, однако меня затянуло в другую, но это, вероятно, решит эту проблему для вас. Просто внесите свой URI в белый список для авторизации. Я использую Google OAuth, и вот скриншот того, что я хочу сказать.

Вам необходимо установить http://127.0.0.1/ в качестве авторизованного домена.

Авторизованный URI в консоли разработчика Google

person Abhishek Iyengar    schedule 07.04.2021