Wenn wir eine API in Ruby on Rails erstellen, ist es wichtig zu kontrollieren, wer Zugriff hat auf die Ressourcen. Hier sind die grundlegenden Ansätze zur Authentifizierung:
Basis-Authentifizierung
Die einfachste, aber wenig sichere Methode. Bei der Basis-Authentifizierung überträgt der Authorization-Header Benutzernamen und Passwort, die in Base64 kodiert sind.
Format des Headers:
Authorization: Basic <base64_string>
<base64_string> = Base64-kodierter String username:password
Zum Beispiel, wenn Sie haben:
- username = apiuser
- password = secret123
Zuerst bilden wir den String:
apiuser:secret123
Dann kodieren wir ihn in Base64:
require 'base64'
credentials = "apiuser:secret123"
encoded = Base64.strict_encode64(credentials)
puts encoded
# => YXBpdXNlcjpzZWNyZXQxMjM=
Also wird der Header so aussehen:
Authorization: Basic YXBpdXNlcjpzZWNyZXQxMjM=
Wenn Rails Authorization: Basic ... sieht, dekodiert die Methode authenticate_or_request_with_http_basic Base64, trennt username:password und überprüft sie auf dem Server.
Token-Authentifizierung
Der Benutzer erhält ein
einzigartiges Token, das er zu jeder Anfrage hinzufügt.
Eine sicherere Option für mobile oder Frontend-Anwendungen.
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
Header der Anfrage:
Authorization: Token abc123
JWT (JSON Web Token)
Eine beliebte Methode für stateless APIs. Der Server speichert keine Sitzungen, der Client sendet ein signiertes Token.
Beispiel mit dem Gem jwt:
# Token erstellen
payload = { user_id: user.id, exp: 24.hours.from_now.to_i }
token = JWT.encode(payload, Rails.application.secret_key_base)
# Token überprüfen
decoded = JWT.decode(token, Rails.application.secret_key_base).first
user_id = decoded["user_id"]
Header:
Authorization: Bearer <jwt_token>
OAuth 2.0
Ein Standard für die Autorisierung und den Zugriff auf Ressourcen über Drittanbieter-Services oder APIs.
Um einen eigenen OAuth 2-Server in Rails zu erstellen, verwendet man
Doorkeeper:
# Gemfile
gem 'doorkeeper'
Nach der Einrichtung können Zugriffstokens an externe Clients ausgegeben werden:
Authorization: Bearer <access_token>
Wenn es erforderlich ist, Benutzern das Einloggen über Drittanbieter-Services (Google, Facebook, GitHub) zu ermöglichen, verwendet man OmniAuth in Verbindung mit Devise zur Authentifizierung.
Einfach ausgedrückt: Doorkeeper — für den Zugriff auf die API, OmniAuth — für das Einloggen von Benutzern über andere Dienste.