devise_token_authのtoken_validation_responseをオーバーライドする

こんにちは!kossyです!




さて、今回はRailsでのトークン認証機能を提供するGem、devise_token_authの
token_validatio_responseメソッドをオーバーライドする方法をブログに残してみたいと思います。



方法

devise_token_authのsessions_controller.rbのcreateアクションを叩いた後、認証に成功した場合に呼び出されるメソッドの中身を見ると、

    def render_create_success
      render json: {
        data: resource_data(resource_json: @resource.token_validation_response)
      }
    end

@resourceに対して、token_validation_responseを呼び出していることがわかります。

この「token_validation_response」は、DeviseTokenAuth::Concerns::Userをモデルにincludeすることで、
生えるメソッドになります。

# includeしている場合
class User
  include DeviseTokenAuth::Concerns::User
end


$ user.token_validation_response
=> {
  id: 1,
  name: 'hoge'
  ...
}

# includeしていない場合
$ user.token_validation_response
=> NoMethodError

定義元のソースコードを見てみます。

def token_validation_response
  self.as_json(except: [
    :tokens, :created_at, :updated_at
  ])
end

モデルクラスから:token, :created_at, :updated_atを除外してjsonとして返却するメソッドになっていますね。

これ、例えば2段階認証用のtoken等のあまりユーザー側に返却したくないデータがあると、困りものですよね。

そんな時はオーバーライドしてしまいましょう。

class User
  include DeviseTokenAuth::Concerns::User

  def token_validation_response
    self.as_json(except: [
      :tokens, :created_at, :updated_at, :two_factor_verification_code
    ])
  end
end

この状態でコンソールで試してみましょう。

# オーバーライドしていない場合
user.token_validation_response
=> {"id"=>1,
 "provider"=>"email",
 "uid"=>"test+0@gmail.com",
 "allow_password_change"=>false,
 "first_name"=>"健太朗",
 "last_name"=>"久保",
 "first_name_kana"=>"ケンタロウ",
 "last_name_kana"=>"クボ",
 "email"=>"test+0@gmail.com",
 "disable"=>false,
 "tenant_id"=>7,
 "uuid"=>nil,
 "two_factor_verification_code": nil
}

# オーバーライドしている場合
$ user.token_validation_response
=> {"id"=>1,
 "provider"=>"email",
 "uid"=>"test+0@gmail.com",
 "allow_password_change"=>false,
 "first_name"=>"健太朗",
 "last_name"=>"久保",
 "first_name_kana"=>"ケンタロウ",
 "last_name_kana"=>"クボ",
 "email"=>"test+0@gmail.com",
 "disable"=>false,
 "tenant_id"=>7,
 "uuid"=>nil
}

two_factor_verification_codeが返っていないことが確認できました。



勉強になりました。