Masahiro Okubo

devise token authでdevise_token_auth_groupをapi dirで使う方法

devise token authでdevise_token_auth_groupをapi dirで使う方法

結論

class Api::GroupsController < ApplicationController
  devise_token_auth_group :member, contains: [:api_group_owner, :api_user]
  before_action :authenticate_member!
end

contains の中身を[:group_user, :user] で設定していたけど認証されないのでソースコードを確認したところ、こんな感じで実装されてました

肝はgroup_name で所々{group_name}_signed_in? などで記載されているので、apiディレクトリならapi_{model_name} と記載すべきだし、v1ならv1_{model_name} で記載することで対応できるかと思います

def devise_token_auth_group(group_name, opts = {})
  mappings = "[#{opts[:contains].map { |m| ":#{m}" }.join(',')}]"

  class_eval <<-METHODS, __FILE__, __LINE__ + 1
    def authenticate_#{group_name}!(favourite=nil, opts={})



      # ここの部分が該当箇所っぽい


      unless #{group_name}_signed_in?
        mappings = #{mappings}
        mappings.unshift mappings.delete(favourite.to_sym) if favourite
        mappings.each do |mapping|
          set_user_by_token(mapping)
        end

        unless current_#{group_name}
          render_authenticate_error
        end
      end
    end

    def #{group_name}_signed_in?
      #{mappings}.any? do |mapping|
        set_user_by_token(mapping)
      end
    end

    def current_#{group_name}(favourite=nil)
      mappings = #{mappings}
      mappings.unshift mappings.delete(favourite.to_sym) if favourite
      mappings.each do |mapping|
        current = set_user_by_token(mapping)
        return current if current
      end
      nil
    end

    def current_#{group_name.to_s.pluralize}
      #{mappings}.map do |mapping|
        set_user_by_token(mapping)
      end.compact
    end

    def render_authenticate_error
      return render json: {
        errors: [I18n.t('devise.failure.unauthenticated')]
      }, status: 401
    end

    if respond_to?(:helper_method)
      helper_method(
        "current_#{group_name}",
        "current_#{group_name.to_s.pluralize}",
        "#{group_name}_signed_in?",
        "render_authenticate_error"
      )
    end
  METHODS
end

参考記事

なし、ソースコードに書いてある

Buy Me A Coffee

関連記事

copyright© 2016-2021 Masahiro Okubo