ЗмістНатисність на посилання, щоб перейти до потрібного місця
Коли ми створюємо API у Ruby on Rails, важливо контролювати, хто має доступ до ресурсів. Ось основні підходи до аутентифікації:
Basic Authentication
Найпростіший, але малобезпечний метод. У Basic Authentication заголовок Authorization передає ім’я користувача та пароль, закодовані у Base64.
Формат заголовка:
Authorization: Basic <base64_string>
<base64_string> = Base64-кодований рядок username:password
Наприклад, якщо у вас:
- username = apiuser
- password = secret123
Спочатку формуємо рядок:
apiuser:secret123
Далі кодуємо його у Base64:
require 'base64' credentials = "apiuser:secret123" encoded = Base64.strict_encode64(credentials) puts encoded # => YXBpdXNlcjpzZWNyZXQxMjM=
Отже, заголовок виглядатиме так:
Authorization: Basic YXBpdXNlcjpzZWNyZXQxMjM=
Коли Rails бачить Authorization: Basic ..., метод authenticate_or_request_with_http_basic декодує Base64, розділяє username:password і перевіряє їх на сервері.
Token Authentication
Користувач отримує унікальний токен, який додає до кожного запиту. Більш безпечний варіант для мобільних або фронтенд-додатків.
class Api::V1::BaseController < ApplicationController before_action :authenticate_user! private def authenticate_user! token = request.headers['Authorization']&.split(' ')&.last @current_user = User.find_by(api_token: token) render json: { error: 'Unauthorized' }, status: :unauthorized unless @current_user end end
Заголовок запиту:
Authorization: Token abc123
JWT (JSON Web Token)
Популярний спосіб для stateless API. Сервер не зберігає сесії, а клієнт надсилає підписаний токен.
Приклад з гемом jwt:
# Створення токена payload = { user_id: user.id, exp: 24.hours.from_now.to_i } token = JWT.encode(payload, Rails.application.secret_key_base) # Перевірка токена decoded = JWT.decode(token, Rails.application.secret_key_base).first user_id = decoded["user_id"]
Заголовок:
Authorization: Bearer <jwt_token>
OAuth 2.0
Стандарт для авторизації та доступу до ресурсів через сторонні сервіси або API.
Для створення власного OAuth 2 сервера в Rails використовують Doorkeeper:
# Gemfile gem 'doorkeeper'
Після налаштування можна видавати токени доступу зовнішнім клієнтам:
Authorization: Bearer <access_token>
Якщо потрібно дозволити користувачам входити через сторонні сервіси (Google, Facebook, GitHub), використовують OmniAuth у зв’язці з Devise для аутентифікації.
Простими словами: Doorkeeper — для доступу до API, OmniAuth — для логіну користувачів через інші сервіси.
Цей допис поки що не має жодних доповнень від автора/ки.