JavaRush /Курсы /Модуль 5. Spring /Лекция 102: Принципы работы OAuth2: аутентификация через ...

Лекция 102: Принципы работы OAuth2: аутентификация через сторонние сервисы

Модуль 5. Spring
11 уровень , 1 лекция
Открыта

Допустим, у вас есть популярное приложение, и пользователи хотят зарегистрироваться, но никто не желает тратить время на заполнение ещё одной формы регистрации, придумывать очередной уникальный пароль и запоминать его. В такие моменты сторонние сервисы аутентификации — это палочка-выручалочка.

Примеры популярных сторонних сервисов:

  • Google: каждый второй пользователь имеет учётную запись Google.
  • Facebook: несмотря на свои взлёты и падения, остаётся популярным инструментом авторизации.
  • GitHub: часто используется разработчиками.
  • LinkedIn: идеален для бизнес-сообществ.

Сторонние сервисы позволяют пользователям входить в ваше приложение, используя уже существующую учётную запись. Это улучшает удобство (никаких новых паролей!) и даёт вам доступ к проверенной информации, такой как адрес электронной почты.


Как OAuth2 помогает интегрировать сторонние сервисы

OAuth2 предоставляет удобный механизм для использования сторонних сервисов, благодаря которому ваше приложение (например, "клиент") может запросить доступ к ресурсам пользователя у сервера авторизации стороннего сервиса. Самое главное — всё работает через токены доступа, а не через передачу паролей, что делает процесс безопасным.

Основной принцип таков:

  1. Ваше приложение перенаправляет пользователя на сервер авторизации (например, Google).
  2. Пользователь предоставляет разрешение на доступ.
  3. Сервер авторизации выдаёт вашему приложению токен доступа.
  4. С помощью полученного токена ваше приложение может безопасно взаимодействовать с ресурсным сервером стороннего провайдера.

Поток авторизации: Authorization Flow

Authorization Flow — это один из потоков OAuth2, который используется для предоставления третьим сторонам (то есть вашему приложению) доступа к ресурсам пользователя с разрешения самого пользователя.

Давайте разберём ключевые этапы:

1. Запрос на авторизацию Ваше приложение перенаправляет пользователя на URL авторизации. Типичный URL выглядит так:


https://accounts.google.com/o/oauth2/auth?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
scope=email profile&
state=xyz

Здесь:

  • responsetype=code — указываем, что хотим использовать Authorization Code Flow.
  • clientid — идентификатор вашего приложения (полученный при регистрации у стороннего провайдера).
  • redirect_uri — URL, на который сервис вернёт пользователя после авторизации.
  • scope — указывает, к каким данным пользователь должен предоставить доступ.
  • state — используется для предотвращения атак с подделкой запросов (CSRF).

2. Пользователь предоставляет разрешение После перенаправления пользователь видит экран авторизации, предоставляемый провайдером (например, Google). Здесь пользователь может решить, хочет ли он предоставить вашему приложению доступ.

3. Получение Authorization Code Если пользователь соглашается, сервер авторизации перенаправляет его обратно на ваш redirect_uri, добавляя в URL параметр code:


https://yourapp.com/callback?code=4/SOME_AUTHORIZATION_CODE&state=xyz

Ваше приложение должно проверить значение state, чтобы убедиться, что это запрос от надёжного источника.

4. Обмен Authorization Code на Access Token Теперь ваше приложение отправляет POST-запрос на сервер авторизации, чтобы обменять код на токен:


POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

code=4/SOME_AUTHORIZATION_CODE&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET&
redirect_uri=YOUR_REDIRECT_URI&
grant_type=authorization_code

Если всё прошло успешно, в ответ вы получите JSON с токеном:


{
  "access_token": "ya29.a0ARrdaM...",
  "expires_in": 3599,
  "scope": "email profile",
  "token_type": "Bearer",
  "refresh_token": "1//09n6..."
}

5. Доступ к ресурсам С помощью полученного access_token ваше приложение может отправлять запросы к ресурсному серверу стороннего провайдера. Например, чтобы получить профиль пользователя:

GET https://www.googleapis.com/oauth2/v1/userinfo?alt=json
Authorization: Bearer ya29.a0ARrdaM...

Как это выглядит в Spring Boot

Здесь начинается самое интересное: реализация этого процесса в Spring Boot.

Шаг 1: Добавьте зависимости в pom.xml Для интеграции Google OAuth2 нам потребуется зависимость Spring Security OAuth2:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Шаг 2: Настройте application.yml Укажите ключи, полученные от Google (или другого провайдера):


  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope: profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/google"
            authorization-grant-type: authorization_code
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://www.googleapis.com/oauth2/v1/userinfo

Шаг 3: Настройте контроллер Создайте контроллер для обработки успешной аутентификации:


import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String user(@AuthenticationPrincipal OAuth2User principal) {
        return "Hello, " + principal.getAttribute("name");
    }
}

Шаг 4: Запустите приложение Запустите ваше приложение и перейдите по URL /oauth2/authorization/google. Вы будете перенаправлены на Google для авторизации. После успешной авторизации вы попадёте на /user, где увидите приветствие с вашим именем.


Типичные ошибки и их решения

  1. Ошибка редиректа: если redirect_uri настроен неверно, Google вернёт ошибку. Убедитесь, что он точно соответствует тому, что настроено в Google Console.
  2. Недостаточные разрешения: если вы забыли указать необходимые scope в настройках, вы не получите нужные данные.
  3. Просроченный токен: используйте Refresh токены для обновления access_token.

OAuth2 с поддержкой сторонних сервисов — это мощный инструмент для удобного и безопасного входа в ваши приложения. Реализация может быть немного сложной, но с Spring Boot вам доступны удобные средства, которые упрощают процесс. Как говорил один умный программист: "Почему бы не позволить гуглу заботиться об аутентификации?".

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ