4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Doorkeeperで認可エラーをハンドリングしたい時

Posted at

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としている。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?