Как реализовать аутентификацию через Google OAuth 2.0 в Python-приложении?

Ответ

Аутентификация через Google реализуется с помощью протокола OAuth 2.0. Он позволяет приложению получать доступ к данным пользователя на сервисах Google с его разрешения, не запрашивая логин и пароль напрямую.

Основной флоу для серверного приложения:

  1. Пользователь инициирует вход через Google.
  2. Приложение перенаправляет пользователя на страницу согласия Google с указанием запрашиваемых прав (scopes).
  3. После согласия Google перенаправляет пользователя обратно в приложение с временным кодом авторизации.
  4. Приложение обменивает этот код на access token и refresh token.
  5. access token используется для запросов к Google API от имени пользователя.

Для упрощения этого процесса в Python используется библиотека google-auth-oauthlib.

Пример для локального скрипта:

from google_auth_oauthlib.flow import InstalledAppFlow

# Укажите права доступа, которые нужны вашему приложению
SCOPES = ['https://www.googleapis.com/auth/userinfo.profile']

# Загрузка учетных данных из файла, полученного в Google Cloud Console
flow = InstalledAppFlow.from_client_secrets_file(
    'client_secret.json', 
    SCOPES
)

# Запуск локального сервера для прохождения аутентификации в браузере
credentials = flow.run_local_server(port=0)

# credentials теперь можно использовать для авторизованных запросов
# Например, сохранить их для будущего использования
with open('token.json', 'w') as token_file:
    token_file.write(credentials.to_json())

print("Аутентификация прошла успешно!")

Ключевые моменты:

  • Необходимо создать проект в Google Cloud Console и получить client_secret.json.
  • Важно правильно настроить Redirect URIs для вашего приложения.
  • access token имеет короткий срок жизни, для долгосрочного доступа используется refresh token.

Ответ 18+ 🔞

Смотри, вот тебе вся эта кухня с гугловым входом, разжёвано как для младенца, но с матом для взрослых.

Короче, есть такая штука — OAuth 2.0. Это типа протокол, который позволяет твоей проге лезть в данные пользователя в Гугле, но без этого дикого говна, когда ты у него напрямую логин-пароль спрашиваешь. Пользователь сам говорит Гуглу: «Да, пусть эта мартышлюшка (твоё приложение) посмотрит мою почту/фотки/что ты там хочешь». Умно, да? Безопасно. Ну, как безопасно... Относительно.

Как это работает на сервере, если не вдаваться в дебри:

  1. Юзер тыкает кнопку «Войти через Гугл».
  2. Твоя прога вышвыривает его на страницу Гугла, где написано: «Этому приложению-пидорасу нужен доступ к вашему аккаунту. Разрешаете?».
  3. Если юзер не идиот и разрешает — Гугл пинком под жопу отправляет его обратно к тебе, но прикрепляет к этому пинку специальный одноразовый код. Типа «предъявитель сего имеет право на доступ».
  4. Твоё приложение, получив этот код, бежит с ним обратно к Гуглу и говорит: «На, обменяй мне эту бумажку на настоящие ключи».
  5. Гугл выдаёт тебе access token (временный пропуск) и, если очень повезёт, refresh token (волшебную флешку, чтобы пропуск обновлять, когда срок действия кончится).
  6. С этим access token ты уже можешь дёргать Гугл АПИ и спрашивать: «Эй, а как этого юзера зовут?».

Чтобы не ебаться с этим вручную, есть библиотека google-auth-oauthlib. Для локального скрипта, который ты на своей машине гоняешь, делается как-то так:

from google_auth_oauthlib.flow import InstalledAppFlow

# Тут ты объявляешь, на что именно ты такой жадина.
# Хочешь профиль? Вот тебе scope на профиль.
SCOPES = ['https://www.googleapis.com/auth/userinfo.profile']

# Грузишь конфиг из файла, который ты должен был выклянчить у Гугла в их Cloud Console.
# Без этого файла — нихуя не выйдет, это как паспорт для твоего приложения.
flow = InstalledAppFlow.from_client_secrets_file(
    'client_secret.json',
    SCOPES
)

# Эта штука запустит локальный сервер, откроет браузер и поведёт юзера за ручку по всем шагам.
credentials = flow.run_local_server(port=0)

# Всё, credentials у тебя в кармане. Можно, например, сохранить их в файл, чтобы потом не проходить этот цирк заново.
with open('token.json', 'w') as token_file:
    token_file.write(credentials.to_json())

print("Ну всё, юзер обдолблен, доступ получен!")

На что смотреть, чтобы не обосраться:

  • Файл client_secret.json — это святое. Его получаешь в Google Cloud Console, создав проект и настроив OAuth. Без него ты просто хуй с горы.
  • Redirect URIs — адреса, куда Гугл может слать ответ. Их надо тупо и правильно прописать в консоли Гугла, иначе будет тихий пиздец и ошибка «redirect_uri mismatch».
  • access token живёт недолго, час или два. А refresh token — это твоя палочка-выручалочка на долгую перспективу. Но его могут и не дать, если неправильно настройки скопаешь. Вот такая, блядь, магия.