⛓️

RailsのToken認証Gemについてまとめてみた

2023/11/02に公開

概要

弊社では、SPAへモバイルアプリなどで、railsでtoken認証を行いたいという要件が増えてきた。現状のDeviseAuthTokenを採用しているが、Token認証が特殊なので、ReactやVue、Flutterなどの認証をサポートしてくれるパッケージで疲弊することが多い。

そこで、業界のデファクトスタンダードであるJWTとリフレッシュトークンをサポートしているRailsの認証パッケージを探してみました。

比較条件

  • Token認証(JWT)をサポートしているか

  • リフレッシュトークンをサポートしているか

  • UUIDが扱えるか

    BigIntで事故って死にかけたときがあったので、UUIDで扱えるか重要なので要件に入れている

比較パッケージ

  1. Devise
  2. Sorcery
  3. Rodauth

1. Devise

言わずもがな、Railsと言ったらDevise。

Devise単体では、jwtはサポートしていない。

devise-jwtを導入することで、jwtはサポートされる。devise-jwtはrefresh-tokenをサポートする予定はないらしい。作者自身は、jwt自体にはrefresh-tokenの概念はあらず。refresh-tokenを使用したいのであれば、OAuthを使用するべきだと主張している。

https://github.com/waiting-for-dev/devise-jwt/issues/7

2. Sorcery

パッケージ自体は比較的人気ではあるが、バージョンを見る限るベータ版である。v1のリリースに向けて、jwtやMFAなどをサポートしていく予定らしい。

https://github.com/Sorcery/sorcery-rework/issues/9

3. rodauth-rails

RodauthをRailsでも使えるようにしたラッパー。パッケージ単体で、jwtやMFAなど様々な認証を提供しており、refresh-tokenに関しても機能提供してる。

UUIDのサポートに関して、Postgresであれば可能らしい。MySQLでは、sequelのMySQLアダプターの不具合でUUIDが今のところ使用不可。コミュニティに確認したところバグだと判明したので、近々修正されるかも?。

https://github.com/janko/rodauth-rails/discussions/239

唯一の欠点は、パッケージがまだまだ若いので、ユーザーベースのユースケースがWeb上に少ないこと。

総評

モバイルアプリやSPAでの認証に関しては、Rodauth1択。ユーザーベースのユースケースが少ないのでやや扱いに困るが、認証のサポートの幅広さなども考えるといいと、企業向けのアプリ開発を行う場合にはいいと思う。

※ 本資料は認証単体の比較で、認可パッケージやロールパッケージとの親和性などは皆無であるので、今後、検証していければと思っている。

余談

昔、C#で開発を行っていたときは、デフォルトでJWTとRefreshTokenがサポートされていたので、サポートされているものだと勝手に思っていた。
しかし、JWT自体には、RefreshTokenという概念がないらしい。RefreshTokenはOAuthで登場する概念であり、devise-jwtの作者の主張も分からなくはない。

Discussion