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

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

Модуль 5. Spring
Рівень 18 , Лекція 1
Відкрита

Припустимо, у тебе популярний додаток, і користувачі хочуть зареєструватися, але ніхто не хоче витрачати час на заповнення ще однієї форми, придумувати черговий унікальний пароль і запам'ятовувати його. У такі моменти сторонні сервіси аутентифікації — справжня паличка-виручалочка.

Приклади популярних сторонніх сервісів:

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

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


Як OAuth2 допомагає інтегрувати сторонні сервіси

OAuth2 надає зручний механізм для використання сторонніх сервісів, завдяки якому твій додаток (наприклад, "client") може запитати доступ до ресурсів користувача у сервера авторизації стороннього сервісу. Найголовніше — все працює через access tokens, а не через передачу паролів, що робить процес безпечним.

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

  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 "Привіт, " + 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 у тебе є зручні засоби, що спрощують процес. Як казав один розумний програміст: "Чому б не дозволити Google подбати про аутентифікацію?".

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ