前回、Rails APIでUser周りの実装をしました。
【Rails】JWTを用いたUser周りのAPI実装
その記事のログイン、ログアウトで気になったことをまとめます。
先にmodel、controllerを貼り付けておきます。
models/usr.rb
class User < ApplicationRecord
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: true
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
end
controllers/api/v1/users_controller.rb
module Api
module V1
class SessionsController < ApiController
# ログイン
def create
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
token = encode_token(user_id: user.id)
render json: { message: "ログインに成功しました。", token: token }, status: :ok
else
render json: { error: "メールアドレスまたはパスワードが無効です。" }, status: :unauthorized
end
end
# ログアウト
def destroy
render json: { message: "ログアウトしました。" }, status: :ok
end
private
# JWTトークンをエンコード
def encode_token(payload)
JWT.encode(payload, Rails.application.secrets.secret_key_base)
end
end
end
end
encode_token
JSON Web Token (JWT) を生成するためのものです。この関数は、渡された payload(トークンに含めたいデータ)をエンコードし、署名付きのトークンを作成します。
def encode_token(payload)
JWT.encode(payload, Rails.application.secrets.secret_key_base)
end
- payload
トークンに含めたい情報をハッシュの形式で payload に渡します。今回は、ユーザーIDです。 - JWT.encode
payload を指定された秘密鍵でエンコードして、JWT(JSON Web Token)を生成します。JWTは、3つの部分から構成される文字列です(ヘッダー、ペイロード、署名)。生成されたトークンは、この3つの部分を結合したもので、後でトークンを検証するときに利用されます。 - Rails.application.secrets.secret_key_base
トークンを署名するための秘密鍵として、Railsの secret_key_base を使用しています。secret_key_base はアプリケーションの機密情報であり、トークンの署名に利用することでトークンの安全性を確保しています。