0
0

Rails:devise_token_authで発生するNoMethodError: undefined method `downcase' for nil:NilClass エラーについて

Posted at

環境
ruby 3.2.2
rails 7.0.8
devise 4.9.2
devise_token_auth 1.2.2

1.エラー

Railsのログイン認証用のgemであるdevise_token_authを使ってログイン機能を実装しようとしたところ、APIにリクエストを送った時点でRails側のログでこのようなエラーが表示されました。

NoMethodError in Api::V1::Auth::RegistrationsController#create
undefined method `downcase' for nil:NilClass

2.対処法

config/initializers/devise_token_auth.rbに:'authorization' => 'authorization'を追加

config/initializers/devise_token_auth.rb
config.headers_names = {:'access-token' => 'access-token',
                        :'client' => 'client',
                        :'expiry' => 'expiry',
                        :'uid' => 'uid',
                        :'token-type' => 'token-type',
                        :'authorization' => 'authorization' }

3.authorizationについて

エラーが発生しているのはrackライブラリの以下の箇所でした

rack-2.2.8/lib/rack/utils.rb
      def []=(k, v)
        p "#{k}: #{k.class} #{v.class}"
        canonical = k.downcase.freeze
        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
        @names[canonical] = k
        super k, v
      end

このk,vにそれぞれヘッダーのkeyとvalueが代入されているのでしょうがどうやらkeyにnilのデータが含まれているようです。そのため一旦initializerのauthorization設定を取り除きutils.rbに渡されるデータを取得しました。

rack-2.2.8/lib/rack/utils.rb
      def []=(k, v)
        p "#{k}: #{k.class} #{v.class}" #ここを追加
        canonical = k.downcase.freeze
        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
        @names[canonical] = k
        super k, v
      end
取得結果
"X-Frame-Options: String String"
"X-XSS-Protection: String String"
"X-Content-Type-Options: String String"
"X-Download-Options: String String"
"X-Permitted-Cross-Domain-Policies: String String"
"Referrer-Policy: String String"
"access-token: String String"
"token-type: String String"
"client: String String"
"expiry: String String"
"uid: String String"
": NilClass String"

そしてNilクラスに対応するvalueにはBearer Tokenが含まれていました

Bearer *******

エラーを解決後に通信を行った際のレスポンスヘッダーを見てみると:authorizationキーにはBearer Tokenが含まれているようでした。

authorization: Bearer *******

そのため、今回のエラーはinitializerでの設定が行われていなかったことによりヘッダーオブジェクトのキーがNilClassとなってしまっていたことが原因で発生したと考えられます。

4.参考

0
0
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
0
0