Вход в Google не работает в режиме инкогнито

#javascript #angular #google-signin

#javascript #angular #вход в Google

Вопрос:

Я использовал вход в Google в своем проекте angular 9. Я использую js API для входа в Google. Выдает ошибку, файлы cookie не включены в текущей среде в режиме инкогнито Google Chrome, хотя на обычной вкладке Google Chrome они работают нормально. ниже приведены сведения об ошибке.

 details: "Cookies are not enabled in current environment."
error: "idpiframe_initialization_failed"
  

Понимаю, что в режиме инкогнито по умолчанию сторонние файлы cookie отключены, но каково решение для этого? Я обнаружил, что другие сайты, использующие вход в Google, отлично работают в режиме инкогнито Google Chrome.

Комментарии:

1. В настоящее время я сталкиваюсь с такой же проблемой. Я обнаружил, что, например, вход в Google в NYTimes отлично работает на вкладке «инкогнито». Я взглянул на его внутренности и заметил, что он создает свои кнопки совсем не так, как я их создаю. В то время как я использую gapi (load, init, attachClickHandler), NYTimes создает свой собственный URL-адрес авторизации и помещает его на кнопку. Я экспериментировал с настройкой cookie_policy на ‘none’, но это не помогло. Не думаю, что это когда-либо сработает в режиме инкогнито, если вы не сделаете это в стиле NYTimes. Я оставляю вам возможность перепроектировать их исходный код.

Ответ №1:

Angular — это просто javascript в браузере. Таким образом, пользователь, загружающий приложение angular, получает кучу javascript с вашего сервера. Если этот сервер обрабатывает аутентификацию с помощью Google-api, то ваш пользователь взаимодействует только с вашим сервером (хотя и с перенаправлением для входа в Google).

Для этого процесса аутентификации не требуются сторонние файлы cookie.

Однако! Если ваша аутентификация обрабатывается непосредственно в браузере пользователя, ваше приложение не будет работать, если сторонние файлы cookie отключены (поскольку они находятся в режиме инкогнито).

Например, у меня есть приложение angular, которое я обслуживаю через страницы Github. Github обслуживает приложение, но больше ничего не делает. Поскольку мне нужно создать документ в GDrive пользователя, я выполняю аутентификацию и получаю доступ к их ресурсам из клиента javascript. Для безопасной работы пользователи my ap должны разрешить сторонние файлы cookie. На самом деле нет способа обойти это.

Если бы у меня был сервер для моего приложения, пользователь мог бы предоставить моему серверу разрешение на доступ к своему Google диску, и сторонние файлы cookie не требовались бы. В этот момент к GDrive пользователя обращается не клиент JavaScript интерфейса (приложение angular), а мой сервер.

Использование серверной части обеспечивает другой и, как правило, более безопасный процесс аутентификации. Однако для пользователя пользовательский интерфейс тот же. Вот почему в некоторых ситуациях пользователь должен разрешать сторонние файлы cookie, а в других — нет.

В общем, вы можете защитить сервер намного лучше, чем вы можете доверять системе / браузеру пользователя, чтобы быть в безопасности. Если вас беспокоит безопасность, вам действительно следует выполнять вызовы API с сервера, а не из браузера. Это также должно решить вашу проблему.

Ответ №2:

Вероятно, вы используете 'ux_mode': 'redirect' , который включает фреймы iframes и файлы cookie.

Попробуйте использовать popup режим.

PS. Вы упомянули «Другие сайты, которые отлично работают» — они, вероятно, используют поток аутентификации OAuth2 на стороне сервера, который основан на перенаправлениях.

PPS. Дополнительная информация https://developers.google.com/identity/sign-in/web/troubleshooting смотрите раздел «Известные проблемы»

Комментарии:

1. Нет, во всплывающем режиме такое же поведение

2. Это потому, что по умолчанию используется значение «всплывающее окно».

Ответ №3:

Простым решением может быть включение Block third-party cookies . перейдите на свою первую страницу в режиме инкогнито, вы можете увидеть внизу Block third-party cookies разворота, что из.

это решение работает, по крайней мере, для меня.

Комментарии:

1. Это не устраняет проблему на сайте, это просто заставляет его работать на компьютере OP. Это все равно было бы нарушено для всех остальных.

Ответ №4:

Если у кого-то возникли проблемы с входом в Google (в частности, с получением токена доступа) в режиме инкогнито, обратитесь к следующему примеру реализации в Next.js

 export default function useGoogleLogin() {
  useEffect(() => {
    const matches = window.location.hash.match(/access_token=([^amp;]*)/);
    if (!matches) {
      return;
    }

    console.log('Access token', matches[1])
  }, []);

  const handleLogin = () => window.location.replace(getAuthUri());

  return { handleLogin };
}
  

И вот реализация getAuthUri

 export default function getAuthUri() {
  let base = window.location.href,
    state = "";
  let i = base.indexOf("#");
  if (i > -1) {
    state = base.substring(i);
    base = base.substring(0, i);
  }
  return (
    "https://accounts.google.com/o/oauth2/v2/auth"  
    "?client_id="  
    encodeURIComponent(process.env.GOOGLE_CLIENT_ID)  
    "amp;redirect_uri="  
    encodeURIComponent(base)  
    "amp;state="  
    encodeURIComponent(btoa(state))  
    "amp;response_type="  
    encodeURIComponent("token")  
    "amp;scope="  
    encodeURIComponent("profile")  
    "amp;include_granted_scopes="  
    encodeURIComponent("true")
  );
}
  

Ответ №5:

Управление сеансом необходимо выполнять, если мы хотим сохранить какие-либо данные в режиме инкогнито.

Spring Session предоставляет API и реализации для управления информацией о сеансе пользователя, а также упрощает поддержку кластеризованных сеансов без привязки к решению, зависящему от контейнера приложения. Он также обеспечивает прозрачную интеграцию с:

HttpSession: позволяет заменить HttpSession нейтральным для контейнера приложения способом с поддержкой предоставления идентификаторов сеанса в заголовках для работы с RESTful API.

WebSocket: предоставляет возможность поддерживать HttpSession активным при получении сообщений WebSocket

Веб-сессия: позволяет заменить веб-сессию Spring WebFlux нейтральным для контейнера приложения способом.