環境
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.headers_names = {:'access-token' => 'access-token',
:'client' => 'client',
:'expiry' => 'expiry',
:'uid' => 'uid',
:'token-type' => 'token-type',
:'authorization' => 'authorization' }
3.authorizationについて
エラーが発生しているのはrackライブラリの以下の箇所でした
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に渡されるデータを取得しました。
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.参考