0
2

More than 1 year has passed since last update.

railsAPIを使ったログイン認証について

Posted at

この記事でどういう順番で実装していくかを記載しています。

今回この記事ではrails APIを使って簡単なAPIを作成できるようになるための手順をSTEPごとに分けて解説していきたいと思います。分からないことは別の記事や公式のリファレンスを確認して実装してください。

そもそも未経験エンジニアがAPIを学習しなければいけない理由としては、昨今の開発ではフロントエンドとバックエンドを分けて開発し、新しいサービスを作るごとに作りなおさずにバックエンドのアプリケーションからAPIをフロント側から呼び込んで使うことが増えてきているそうです。

私も理解して実装するまでにはかなりの時間がかかりましたが、順を追って学習していけばrailsAPIを使ったログイン認証を実装してみましょう!

では実装の流れ

①railsAPIモードで新規プロジェクトを作成し、ユーザーモデルを作成する。

rails new (プロジェクト名) --api
#ユーザー名とパスワードの実装は自分で調べましょう。パスワードはsecureにしてください。
rails generate model user (ユーザー名とパスワード)

②ユーザーのアプリケーションコントローラーを作成する

class Api::UsersController < ApplicationController
  def create
    user = User.new(user_params)
    if user.save
      render json:
        { user:{id: user.id, username: user.username, email: user.email }}, status: :created
    else
      render json: { errors: user.errors.full_messages }, status: :unprocessable_entity
    end
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password)
  end
end

③JWTトークンと、リフレッシュトークンを発行するアプリケーションコントローラーを作成する

#jwtのgemを読み込む  gemの詳細はこちらhttps://rubygems.org/gems/jwt/versions/2.2.1?locale=ja
gem 'jwt'  

#apprication_contoroller
class Api::SessionsController < ApplicationController
require 'jwt'
  # POST /api/login
  def create
    # userデータベースから入力されたemailとpasswordの組み合わせが正しければユーザーを取得する
    if 
      #正しい組み合わせのユーザーがいた場合トークンをレスポンスする部分は調べて作成してみてください!
      access_token = JWT.encode({}, 'secret_key')
      refresh_token = JWT.encode({}, 'refresh_secret')
      user.update(refresh_token: refresh_token)
        #レンダリングとしてjson形式でアクセストークンとリフレッシュトークンをレスポンスする。
      render json: { accessToken: access_token, refreshToken: refresh_token }, status: :ok
    else # 正しい組み合わせでない場合はunauthorizedで認証できない旨をレスポンス
    
    render status: :unauthorized
    end
  end

  # POST /api/refresh
  def refresh
    refresh_token = request.headers['X-Refresh-Token']
    return render status: :unauthorized unless refresh_token

    user = User.find_by(refresh_token: refresh_token)
    return render status: :forbidden unless user

    payload, = JWT.decode(refresh_token, 'refresh_secret')
    return render status: :forbidden unless payload['data']['user_id'] == user.id

    data = { user_id: user.id }
    access_token = JWT.encode({ data: data, exp: Time.current.since(30.seconds).to_i }, 'secret')
    render json: { accessToken: access_token } , status: :ok
  end
end

発行されたトークンからユーザーIDを取得する。

class ApplicationController < ActionController::API

def current_user
  # トークンを取得する
  token = request.headers["Authorization"].split(" ")[1]
  # トークンからペイロードを取得する
  begin
    payload = JWT.decode(token, "secret_key", true, algorithm: "HS256")[0]
  rescue JWT::DecodeError
    return nil
  end
  # ペイロードからユーザーIDを取得する
  user_id = payload["data"]["user_id"]
  Rails.logger.debug "user_id: #{user_id}"
  # ユーザーIDからユーザーを取得する
  user = User.find_by(id: user_id)
  Rails.logger.debug "user: #{user.inspect}"
  user
end

end

あとはルーティングの設定をすればユーザー認証機能は実装完了となります。
rails APIモードではviewは作成されません。このrailsのバックエンドを実装しておけばフロントエンドのフレームワークからAPIを利用することが可能になります。
ちなみに今回APIの仕様はRealWorldの仕様の一部に準拠しています。

ユーザー認証ができているかどうかはPostman(APIを開発・テストするためのコラボレーションプラットフォーム)などを利用することで機能しているか確認することができます。
postmanについてはローカル環境で開発するのであればダウンロード版を利用してください。

エンジニアへ転向できるように一緒に頑張りましょう!

未経験エンジニアの私が学習した内容を記載しているためすべて鵜呑みにせずあっているかどうか自分でも確認してください。

また、有識者の方で”ここ間違ているよ”とか”もっとこうした方がいいよ”ということがあれば教えてください!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2