Подтвердить что ты не робот

Django CORS Access-Control-Allow-Origin отсутствует

Я пытаюсь реализовать проверку подлинности google oauth2 в своем приложении django. Я выполнил все шаги в соответствии с docs.

В адресной строке браузера, если я просматриваю этот https://foo.bar.net/api/v1/auth/login/google-oauth2/ этот URL-адрес, он правильно аутентифицируется google и возвращает токен google-auth к указанному URL-адресу перенаправления, и он извлекает токен аутентификации и преобразует его в обычный токен, который затем отправляется пользователю или интерфейсу в формате json.

Но если я попытался сделать запрос GET на вышеупомянутый url из моего js-кода, он показывает

Reason: CORS header 'Access-Control-Allow-Origin' missing

Полная трассировка на интерфейсе выглядит следующим образом:

GET https://foo.bar.net/api/v1/auth/login/google-oauth2/ 302 Found 718ms    
polyfil...ndle.js (line 7507)
GET https://accounts.google.com/o/oauth2/auth?client_...DW&response_type=code&scope=openid+email+profile 200 OK
Login Failed Response { _body=Event error,  status=0,  ok=false,  more...}
main.bundle.js (line 367)
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://accounts.google.com/o/oauth2/auth?client_id=kguygvh868697-khgkhvkgvkgkgv.apps.googleusercontent.com&redirect_uri=https://foo.bar.net/api/v1/auth/complete/google-oauth2/&state=Cbms1QhSQVzjO3xkjhkyuu&response_type=code&scope=openid+email+profile. (Reason: CORS header 'Access-Control-Allow-Origin' missing).

Я искал google, который предлагает мне установить djang-CORS-headers. Я установил и настроил вышеуказанный пакет. Но та же ошибка появляется.

Часть моего settings.py выглядит,

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware',
]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'oauth2_provider',
    'corsheaders',
    'rest_framework_swagger',
]

CORS_ORIGIN_ALLOW_ALL = True

На самом деле у нас есть два отдельных проекта как для frontend (ang), так и для backend (django). Я согласен с проблемой ajax. Так что я заставил URL-адрес google oauth открываться в отдельном окне.

В бэкэнд я сделал до получения токена доступа к серверу и обменял его с токеном доступа к приложениям. В настоящее время я возвращаю данные маркера в формате json. Таким образом, этот json будет отображаться во вновь открывшемся окне. Но не знаю, как

  • получить токен из окна и сохранить его в временном хранилище в браузере.

  • закройте новое окно после появления деталей.

  • перенаправить на страницу пользователей/профиля, передав информацию маркера в заголовок запроса.

Не знаю, правилен ли этот поток oauth или нет. И также я не хочу, чтобы полный поток oauth находился в js-части (oauth implicit flow). Pls направит меня в правильном направлении.

4b9b3361

Ответ 1

Проблема заключается в том, что поток кода авторизации не должен использоваться в интерфейсе, вам нужно использовать неявный поток здесь (https://developers.google.com/actions/identity/oauth2-implicit-flow) вместо потока кода авторизации (https://developers.google.com/actions/identity/oauth2-code-flow)

Я думаю, вы также пропустили упоминание разрешенных заголовков

  CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)