devise-jwtを利用してDeviseでJWTトークンによる認証を行う

はじめに

Vue.jsやAngularなどのバックエンドとしてRailsを利用する際に悩むのが、認証周りの実装方法です。せっかくRailsを利用しているのですから、叶うことならイイ感じのgemを利用して、サクッと形にしてしまいたいところでしょう。

取り分け、Deviseを利用しようと考えている、あるいは既に利用している場合など、自前で書くのは面倒だなぁと思います。そういった時に便利なのが、devise-jwtというgemでございます。

使い方

インストールはGemfileにパッケージ名を記載してbundle installするだけです。

gem install devise-jwt

必要な設定はDeviseの初期化と併せて行います。README.mdにはsecretの指定のみありますが、他に:expiration_time :dispatch_requests :revocation_requests aud_headerなどが指定できるみたいですね。

(参考:devise-jwt/lib/devise/jwt.rb)

トークンの失効戦略については、幾つか選択肢が用意されているようです。もっとも導入が簡単なのは、JTIMatcherではないでしょうか。Deviseの対象モデルに以下の通り、その指定を入れます。

また、マイグレーションファイルを作成して、同時にモデルに必要なカラムを追加します。

以上で完了です。Deviseにログインのリクエストを送ると、レスポンスのAuthorizationヘッダーにJWTトークンが付与されて返されるようになります。

補足

注意事項としては、こちらのgemはクッキーの利用が不可能である場合、その認証をAuthorizationヘッダーに切り替える機能を提供しているという点です。もしも同一ドメインへのアクセスに対して、クッキーが乗ってきている場合、そちらが優先されるそうです。

参考:Application with API & GUI: Session cookie is set, so clients can use this to authenticate insteaded of JWT #46

Rails

Posted by poison