結論
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
参考記事
なし、ソースコードに書いてある
コメントを残す