[ROR]JWTを使用した会員加入機能



今回は周りの知り合いとTOYプロジェクトを行うことになりましたが、私が担当している部分はapiサーバー部分です.
どのようなフレームワークで実施するかを考慮すると、最もよく知られているレールを選択しました.設定が完了したら、登録機能を開発する際に使用するJWTを含むJWT実装プロセスに関する記事を書きたいと思います.

1.Gemfileのインストールと適用


まず簡単にGemfileにJWTライブラリを書き込みます.
gem 'jwt'
ライブラリを適用します.
bundle install

2.Railsでファイルを作成する


1) lib/json_web_token.rbファイルを追加します.
class JsonWebToken
  SECRET_KEY = Rails.application.secrets.secret_key_base .to_s

  def self.encode(payload)
    payload[:exp] = 15.minutes.from_now.to_i
    JWT.encode(payload, SECRET_KEY)
  end
  
  def self.decode(token)
    decode = JWT.decode(token, SECRET_KEY)[0]
    HashWithIndifferentAccess.new decode
  end
end
encodeメソッドとdecodeメソッドを追加します.
Encodeメソッドは、SCERET KEYおよびpay loadを使用して作成されたJWTタグを生成するためのメソッドであり、decodeの場合、ユーザが受信したタグを解釈するために使用される.
railsがjson web tokenの場合.rbファイルを読み込めない場合
confing/application.次のコードをrbファイルに追加して、すべてのlibファイルをロードできます.
config.autoload_paths += Dir["#{config.root}/lib"] 
2) application_controller.rbファイルに追加します.以下に示します.
def token_authentication

    http_request = request.headers["Authorization"]
    auth_token = http_request.to_s.split(" ").last
    decode_token = JsonWebToken.decode(auth_token)
    @user = User.find(decode_token["user_name"])

  rescue JWT::ExpiredSignature => e
    render json: { errors: e}, status: :unauthorized
end
appllcation_controller.rbファイルにtoken authenticationというメソッドを作成し、ユーザーが受け取ったタグを説明します.
期限切れのタグの場合は、resourceでユーザーに期限切れのタグを通知します.
3) users_controller.rbファイルに追加します.以下に示します.
  before_action :token_authentication

  def create
    user = User.new(user_params)
    access_token = JsonWebToken.encode(user_name: user.name)
    if user.save
      render json: { access_token: access_token}, status: :ok
    else
      render json: { errors: e}, status: :unauthorized
    end
  end

  private
  def user_params
    params.permit(:email, :password, :name, :nickname, :sns)
  end
私の場合、登録会員のapiを作成しています.ユーザーから取得した名前を使用してJWTタグを作成します.

3.ログイン方式を改善する方向は?


上記の場合、access tokenのみが使用されます.
アクセスtokenのみを使用すると、セキュリティリスクが高いため、単独ではなくrefresh tokenとともに使用されます.
そこで、refresh tokenを追加してセキュリティを強化しようとしました.
refresh tokenのストリームを追加

  • ユーザーがログインすると、2つのaccess tokenとrefresh tokenが発行され、ユーザーに転送されます.

  • refresh tokenの場合、サーバdbに格納されます.

  • ユーザがapiを要求するたびにaccess tokenが受信され、有効なトークンであるかどうかを確認します.

  • acess tokenが期限切れになっていない場合は、クライアントにrefresh tokenを発行し、refresh tokenが有効なタグであることを確認するように要求します.

  • 有効なトークンであればユーザに情報を送信し、期限切れのトークンであればrefresh tokenを比較し、有効なrefresh tokenであればaccess tokenを再発行してユーザに送信する.
  • 注意:https://kbs4674.tistory.com/89?category=822778