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が返っていないことが確認できました。
勉強になりました。