SorceryはRails向けの認証用ライブラリです。2025年現在ではRailsで認証と言えばdeviseを思い浮かべる人が多いと思いますが、10年ほど前はもっと多様な選択肢があり、その選択肢の中にはSorceryも入っていました。
Sorceryを使う利点の一つは比較的素朴に作られているためコードが読みやすい点です。モジュールの形で認証の各機能が整理されています。これらのモジュールがモデルやコントローラにincludeされて利用されるので「この機能はどのように動いているのだろう?」と思ったときに比較的容易に振る舞いを理解することができます。
Sorceryの滞っていたメンテナンスを再開させた
そんなSorceryですがここ数年はメンテナンスが滞っており、一時期は"Sorcery is currently unmaintained"という宣言がREADMEに書かれていました。
僕自身は直接Sorceryを使っていませんが、お手伝い先が使っているのとRailsのお作法に則っていない*1のがどうしても気になるのでメンテナになって少しずつコミットを積むことにしました。
Sorceryは他のgemと違い単純にActiveSupport.on_loadを利用すると既存の振る舞いを壊してしまいます。そのため修正にはかなり大掛かりな構造変更が必要になるのではないかと考えています。場合によっては非互換な変更が避けられないかもしれません。そのためにまずは溜まっている技術負債を返済してから取り組むつもりで少しずつ活動しています。来年中にはお作法通りに動かせるといいなあ。
本当はお作法の箇所を直してからリリースしたかったのですが、だいぶ差分が大きくなってしまったのと、早くリリースしたほうがいい機能があったのでこのタイミングでv0.18.0をリリースすることにしました。
Release v0.18.0 · Sorcery/sorcery
v0.18.0のリリースにあたってリリース権限をもらったので、今後はもっと細かい単位でリリースできると思います。
主な変更点
1番大きい変更は古いRubyとRailsのサポートを切り捨ててRuby3.2以上、Rails7.1以上のサポートにしたところです。これによりRailsのバージョン分岐をするif文が減ってメンテナンスしやすくなりました。
次に大きい変更点はredirect_back_or_toのメソッド名変更です。該当PRはこちら: Add an option 'use_redirect_back_or_to_by_rails' to avoid definition conflicts of redirect_back_or_to by atolix · Pull Request #373 · Sorcery/sorcery。Sorceryはもともと「未ログイン状態でアクセスしたときのパスへログイン後にリダイレクトする」ためのメソッドとしてredirect_back_or_toメソッドを用意していましたが、Rails7.0で同名のメソッドができてしまいました。Rails版は「リファラがあったらリファラのパスにリダイレクトする」というメソッドになっており振る舞いが違います。メソッドの探索順序の都合でSorcery側が優先されるため、Rails版を使っている認識なのに実はSorcery版のredirect_back_or_toを使っていた、というケースが起こり得ます。これを防ぐためにSorcery版は別名(redirect_to_before_login_path)を用意して、Sorcery版のredirect_back_or_toを使ったら警告を出すようにしました。もしSorceryを使っているひとがいたらredirect_back_or_toを使っているところがあるかどうか確認ください。
協力のお願い
僕のSorceryを改善するモチベーションはseed-fuやgonの時と同様に、新しいRubyやRailsでちゃんと動くようにしたいというところが大きいです。機能追加もPRがきたら考慮しますが、自分から積極的にどうこうするというつもりは今のところないです。つまりRailsのお作法に則ったコードにするまではそれなりに僕の手は動くと思いますが、それ以降は最低限の活動になると予想されます。
恐らく日本でSorceryを使っている会社は少なからずあると思うので、興味があるひとは改善に手を貸してもらえると嬉しいです。まだまだ改善できるポイントはたくさんあります!
Sorcery/sorcery: Magical Authentication
*1:Railsのお作法に関しては以前ブログエントリにした ので詳細はこちらを参照ください
