RailsのToken認証Gemについてまとめてみた
概要
弊社では、SPAへモバイルアプリなどで、railsでtoken認証を行いたいという要件が増えてきた。現状のDeviseAuthTokenを採用しているが、Token認証が特殊なので、ReactやVue、Flutterなどの認証をサポートしてくれるパッケージで疲弊することが多い。
そこで、業界のデファクトスタンダードであるJWTとリフレッシュトークンをサポートしているRailsの認証パッケージを探してみました。
比較条件
-
Token認証(JWT)をサポートしているか
-
リフレッシュトークンをサポートしているか
-
UUIDが扱えるか
BigIntで事故って死にかけたときがあったので、UUIDで扱えるか重要なので要件に入れている
比較パッケージ
- Devise
- Sorcery
- Rodauth
Devise
1.言わずもがな、Railsと言ったらDevise。
Devise単体では、jwtはサポートしていない。
devise-jwtを導入することで、jwtはサポートされる。devise-jwtはrefresh-tokenをサポートする予定はないらしい。作者自身は、jwt自体にはrefresh-tokenの概念はあらず。refresh-tokenを使用したいのであれば、OAuthを使用するべきだと主張している。
Sorcery
2.パッケージ自体は比較的人気ではあるが、バージョンを見る限るベータ版である。v1のリリースに向けて、jwtやMFAなどをサポートしていく予定らしい。
rodauth-rails
3.RodauthをRailsでも使えるようにしたラッパー。パッケージ単体で、jwtやMFAなど様々な認証を提供しており、refresh-tokenに関しても機能提供してる。
UUIDのサポートに関して、Postgresであれば可能らしい。MySQLでは、sequelのMySQLアダプターの不具合でUUIDが今のところ使用不可。コミュニティに確認したところバグだと判明したので、近々修正されるかも?。
唯一の欠点は、パッケージがまだまだ若いので、ユーザーベースのユースケースがWeb上に少ないこと。
総評
モバイルアプリやSPAでの認証に関しては、Rodauth1択。ユーザーベースのユースケースが少ないのでやや扱いに困るが、認証のサポートの幅広さなども考えるといいと、企業向けのアプリ開発を行う場合にはいいと思う。
※ 本資料は認証単体の比較で、認可パッケージやロールパッケージとの親和性などは皆無であるので、今後、検証していければと思っている。
余談
昔、C#で開発を行っていたときは、デフォルトでJWTとRefreshTokenがサポートされていたので、サポートされているものだと勝手に思っていた。
しかし、JWT自体には、RefreshTokenという概念がないらしい。RefreshTokenはOAuthで登場する概念であり、devise-jwtの作者の主張も分からなくはない。
Discussion