All original content is created in Ukrainian. Not all content has been translated yet. Some posts may only be available in Ukrainian.Learn more

Main methods of authentication in API

Post cover: Main methods of authentication in API
Table of contentsClick link to navigate to the desired location
This content has been automatically translated from Ukrainian.
When we create an API in Ruby on Rails, it's important to control who has access to resources. Here are the main approaches to authentication:

Basic Authentication

The simplest, but least secure method. In Basic Authentication, the Authorization header transmits username and password encoded in Base64.
Header format:
Authorization: Basic <base64_string>
<base64_string> = Base64-encoded string username:password
For example, if you have:
  • username = apiuser
  • password = secret123
First, we form the string:
apiuser:secret123
Next, we encode it in Base64:
require 'base64'

credentials = "apiuser:secret123"
encoded = Base64.strict_encode64(credentials)
puts encoded
# => YXBpdXNlcjpzZWNyZXQxMjM=
So, the header will look like this:
Authorization: Basic YXBpdXNlcjpzZWNyZXQxMjM=
When Rails sees Authorization: Basic ..., the method authenticate_or_request_with_http_basic decodes Base64, splits username:password, and checks them on the server.

Token Authentication

The user receives a unique token that is added to each request.
A more secure option for mobile or frontend applications.
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
Request header:
Authorization: Token abc123

JWT (JSON Web Token)

A popular method for stateless APIs. The server does not store sessions, and the client sends a signed token.
Example with the jwt gem:
# Creating a token
payload = { user_id: user.id, exp: 24.hours.from_now.to_i }
token = JWT.encode(payload, Rails.application.secret_key_base)

# Verifying the token
decoded = JWT.decode(token, Rails.application.secret_key_base).first
user_id = decoded["user_id"]
Header:
Authorization: Bearer <jwt_token>

OAuth 2.0

A standard for authorization and access to resources through third-party services or APIs.
To create your own OAuth 2 server in Rails, use Doorkeeper:
# Gemfile
gem 'doorkeeper'
After setup, you can issue access tokens to external clients:
Authorization: Bearer <access_token>
If you need to allow users to log in through third-party services (Google, Facebook, GitHub), use OmniAuth in conjunction with Devise for authentication.
In simple terms: Doorkeeper — for API access, OmniAuth — for user login through other services.

This post doesn't have any additions from the author yet.

What is exponential growth?
16 Sep 18:57

What is exponential growth?

meme code
meme code@memecode
What is factorial complexity?
16 Sep 19:03

What is factorial complexity?

meme code
meme code@memecode
What is NP-complexity?
16 Sep 19:31

What is NP-complexity?

meme code
meme code@memecode
Offset vs Cursor Pagination in Rails: what to choose and why
24 Sep 15:22

Offset vs Cursor Pagination in Rails: what to choose and why

meme code
meme code@memecode
What is Row Security in PostgreSQL and why is it important for Rails developers
04 Oct 19:06

What is Row Security in PostgreSQL and why is it important for Rails developers

meme code
meme code@memecode
What is ivar in Ruby / Rails?
19 Oct 20:12

What is ivar in Ruby / Rails?

meme code
meme code@memecode
What are the differences between OAuth 1 and OAuth 2
19 Oct 20:34

What are the differences between OAuth 1 and OAuth 2

meme code
meme code@memecode
What is ORM and why is it needed?
26 Oct 14:00

What is ORM and why is it needed?

meme code
meme code@memecode
MCP: a new internet where websites communicate with AI
04 Nov 11:43

MCP: a new internet where websites communicate with AI

meme code
meme code@memecode
Why is TOON better than JSON when working with AI?
14 Nov 15:14

Why is TOON better than JSON when working with AI?

meme code
meme code@memecode