Authentification API avec JWT dans Ruby on Rails


Ruby on Rails JWT : Plongez dans l’authentification des API avec notre guide complet sur l’utilisation de JSON Web Tokens (JWT). Découvrez la configuration, la génération de tokens, la validation des requêtes et bien plus encore. Renforcez la sécurité de vos applications web dès aujourd’hui. #RubyOnRails #APIsecurity #JWT

L’authentification JSON Web Token (JWT), également connue sous le nom d’authentification basée sur les tokens, représente une nouvelle approche pour gérer l’authentification des utilisateurs dans les applications. C’est une méthode alternative à l’authentification basée sur les sessions.

Dans ce blog, plongeons dans l’univers captivant de l’authentification JWT et découvrons comment implémenter cette méthode, qui se révèle être la solution optimale pour l’authentification des utilisateurs dans le monde du développement Ruby on Rails.

Comprendre la différence entre Stateless vs Stateful

La distinction la plus marquante entre l’authentification basée sur les sessions et l’authentification basée sur les tokens réside dans le fait que l’authentification basée sur les tokens est stateless. Cela signifie que nous ne stockons aucune information sur l’utilisateur connecté sur le serveur, éliminant ainsi la nécessité d’un modèle ou d’une table pour les sessions utilisateur.

L’authentification basée sur les sessions, quant à elle, dépend fortement du serveur, créant un enregistrement pour chaque utilisateur connecté.

Contrairement à l’authentification basée sur les sessions, la méthode basée sur les tokens n’associe pas l’utilisateur aux informations de connexion, mais à un jeton unique utilisé pour gérer les transactions entre le client et le serveur.

La Structure des JSON Web Tokens (JWT)

Un JWT est facilement identifiable, c’est une combinaison de trois chaînes séparées par des points.

  1. En-Tête (Header)
  • Le type de jeton.
  • L’algorithme de hachage à utiliser, tel que HMAC SHA256 ou RSA.
  1. Payload
  • Contient des informations sur l’utilisateur et son rôle. Par exemple, un payload de jeton payant peut contenir un e-mail et un mot de passe.
  1. Signature
  • Une clé unique identifiant un service qui crée un en-tête. Dans notre cas, la signature du jeton sera la version encodée en base64 avec le code secret de l’application Rails (Rails.application.secrets.secret_key_base). Comme chaque application a une clé secrète unique, cette clé secrète agit comme une signature de jeton.

L’authentification basée sur les Tokens

Le processus de vérification basé sur les tokens est simple. L’utilisateur entre ses détails et envoie la requête au serveur. Si les informations sont correctes, le serveur crée un jeton unique encodé HMACSHA256, également appelé le JSON Web Token (JWT). Le client conserve le JWT et exécute toutes les requêtes suivantes sur le serveur avec le jeton attaché. Le serveur vérifie l’utilisateur en comparant le JWT envoyé avec la requête à celui qu’il a stocké dans la base de données.

Bien sûr, continuons avec le reste de l’article, en partant de la création du contrôleur d’authentification ($ rails g controller authentication).


Implémentation Pratique : Passons au Code Ruby On Rails

Avec le contrôleur d’authentification en place, plongeons dans l’implémentation de la fonctionnalité de connexion.

Création du Contrôleur d’Authentification

$ rails g controller authentication

Ce contrôleur sera le chef d’orchestre de notre danse enchantée de l’authentification basée sur les tokens.

Mise en Place de la Logique JWT

Le cœur de notre application réside dans la gestion des JSON Web Tokens. Créons un fichier de préoccupation (concern) pour abstraire cette logique :

# app/controllers/concerns/json_web_token.rb
module JsonWebToken
  extend ActiveSupport::Concern

  def encode_token(payload)
    JWT.encode(payload, Rails.application.secrets.secret_key_base)
  end

  def decode_token(token)
    JWT.decode(token, Rails.application.secrets.secret_key_base, true, algorithm: 'HS256')[0]
  end
end

Création de la Fonction authenticate_request

Dans le même contrôleur, ajoutons une fonction pour authentifier les requêtes :

# app/controllers/authentication_controller.rb
class AuthenticationController < ApplicationController
  include JsonWebToken

  def authenticate
    user = User.find_by(email: params[:email])

    if user && user.authenticate(params[:password])
      token = encode_token(user_id: user.id)
      render json: { user: user, token: token }
    else
      render json: { error: 'Invalid email or password' }, status: :unauthorized
    end
  end
end

Mise en Place des Routes

Mettez à jour vos fichiers de configuration des routes (config/routes.rb) pour inclure les routes nécessaires :

# config/routes.rb
Rails.application.routes.draw do
  post '/login', to: 'authentication#authenticate'
  # Ajoutez d'autres routes selon vos besoins
end

Testons notre Sortilège avec Postman

Avant de conclure notre aventure, testons notre application avec Postman pour nous assurer que tout fonctionne correctement.

Création d’un Utilisateur

Requête :

POST http://localhost:3000/users
{
  "name": "John Doe",
  "username": "johndoe",
  "email": "john.doe@example.com",
  "password": "password123"
}

Réponse :

{
  "user": {
    "id": 1,
    "name": "John Doe",
    "username": "johndoe",
    "email": "john.doe@example.com",
    "created_at": "2023-01-01T12:00:00Z",
    "updated_at": "2023-01-01T12:00:00Z"
  },
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.bGm3rWyIh1..."
}

Connexion d’un Utilisateur

Requête :

POST http://localhost:3000/login
{
  "email": "john.doe@example.com",
  "password": "password123"
}

Réponse :

{
  "user": {
    "id": 1,
    "name": "John Doe",
    "username": "johndoe",
    "email": "john.doe@example.com",
    "created_at": "2023-01-01T12:00:00Z",
    "updated_at": "2023-01-01T12:00:00Z"
  },
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.bGm3rWyIh1..."
}

Conclusion :

Félicitations, vous avez parcouru un voyage enchanteur dans le monde des JSON Web Tokens (JWT) dans Rails 6.7 ! Vous avez appris à créer un système d’authentification robuste, basé sur des tokens, pour votre application Ruby on Rails.

Ce n’est que le début de votre aventure dans le royaume de l’authentification sécurisée. Explorez, expérimentez, et transformez cette base solide en une expérience utilisateur captivante et sans faille. 🚀🔐

Ressources supplémentaires :