Doorkeeperでbefore_action :doorkeeper_authorize!
の自動で出力される認可エラーを変更したい時はメソッドdoorkeeper_unauthorized_render_options(error: nil)
をControllerでオーバーライドしhashを返す。
doorkeeper-gemのwikiに書いてある
https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-the-response-body-when-unauthorized
ただ、これが分かりづらかった。Wikiにあるコードは↓
class ApplicationController < ActiveController::Base
def doorkeeper_unauthorized_render_options(error: nil)
{ json: { error: "Not authorized" } }
end
end
このhash部分、
{ json: { error: "Not authorized" } }
キーjsonは必須でかつシンボルでないとダメ。
自分の場合はjbuilderでエラー時のjsonを決めていて、それを呼び出しているので次のようにした
class Api::V1::ApiController < ApplicationController
def doorkeeper_unauthorized_render_options(error: nil)
@error = WebAPIError.error_authorize(error.description) # WebAPIErrorは自作のクラスなのであまり考えないように
error_str = render_to_string(template: 'api/v1/error') # render_to_stringで文字列としてjbuilderから取得
json = "{ \"json\": #{error_str} }" # json:の形に
JSON.parse(json, {symbolize_names: true}) # symbolize_namesでシンボル化
end
end
.jbuidlerファイルは次のようにしている
json.error do
json.code @error.code
json.message @error.message
json.developer_message @error.developer_message
end
これはdoorkeeper_authorize
以外でも呼び出して使いまわすためわざわざファイル.jbuilderとしている。