はじめに
devise-token-auth とは?
Railsにおけるトークン認証を実現するgemです。
このdevise-token-auth
を用いることで、新規登録、ログイン・ログアウトなどはもちろんのこと、アプリ各種操作を行う時にheader
情報にユーザーの認証情報(トークン)を載せてバックエンド側(RailsのAPI側など)に送ることで、毎回の処理を安全に実行することができます。
そこで今回は、RailsでAPI提供を行う際の devise-token-auth の使い方について解説します。
トークン認証 とは?
簡単に言うと、ログイン・ログアウト、新規登録などのユーザー認証を行う方法の1つで、トークンと呼ばれるしるし(トークンの英語訳)のようなものを利用して認証を行います。
トークン認証の他に、cookiesと呼ばれるものを使ったsession認証が有名ですが、RailsをAPI提供として利用する場合、アプリケーションの動作環境がネイティブアプリ(Mac, Windows, android, iOSなど)になることがあります。
これらネイティブアプリでは、cookiesを保存できないことがある(つまり、session認証ができない)ことがあるので、このトークン認証が注目されています(トークン認証とsession認証の違いについて詳しく知りたい方はこちらをご覧下さい)。
初期設定
まずは、APIモードでRailsアプリとデータベースを作成して下さい。
rails new [アプリ名] --api -d [使用するDB] # -d 以降は省略しても構いません
rails db:create
それでは、devise_token_auth
をGemfileに追加しましょう。
このタイミングでdevise
、必要に応じてrack-cors
gemを一緒にインストールして下さい。
devise
はdevise_token_auth
の細かいところをフォローしてくれ、rack-cors
はフロントエンドがVue、バックエンドでRailsのAPI提供を行うといった場合に、URL(詳しくはorigin)のアクセスが重複することを許可してくれます。
gem "devise"
gem "devise_token_auth"
gem "rack-cors" # Railsアプリインストール時にコメントアウトされていると思います。
次に、devise
、devise_token_auth
の順にインストールを行いましょう(DBを作成していない場合や、順番を間違えるとエラーが発生するので注意)。
rails g devise:install
rails g devise_token_auth:install User auth
これで準備は完了です!
次からは実際に、認証機能を実装していきましょう!
認証機能実装
APIのバージョンを管理をする(v1、v2など)ことが多いと思いますので、その想定で実装していきます。
まずは、devise_token_auth
を用いた認証を行うコントローラーを作成します。
rails g controller v1/auth/registrations
すると、app/controllers/v1/auth/registrations_controller.rb
が作成されるので、それを以下内容に修正して下さい。
class V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController
end
これは何をしているのか?と言いますと、devise_token_auth
gemであらかじめ用意されている認証用のコントローラーを、作成したregistrations_controller
に継承しています。
継承したコントローラーを使用し、次の内容のルーティングを設定することで、使用するアプリの認証機能を実現することが可能となります!
namespace :v1 do
mount_devise_token_auth_for "User", at: "auth"
end
また、作成されたUser
モデルの:trackable
をコメントアウトするか、削除して下さい(ログイン時にエラーが発生します)。
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :trackable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
include DeviseTokenAuth::Concerns::User
end
使い方
こちら(以下)から、どのようなHTTPリクエストで各種ユーザー認証機能を使うことができるのかを確認できます。
右側のpurpose
に、それぞれ必要となるパラメータが記載されてあるため、それらパラメータをリクエスト時に渡す必要があります。
具体的な内容は、次の動作確認セクションで説明しますね!
動作確認
今回は簡易的な動作確認としてAdvanced Rest clientを使用して動作確認を行います(RailsのRSpecでテストを実装することがベストな確認方法です)。
Advanced Rest client とは、HTTPリクエストの送信、レスポンスの確認が可能なchromeの拡張機能です。
これを使い、それぞれのユーザー認証機能に必要なパラメータをJSONとして送信します。
実際のアプリでは、フロントエンド側からこれらのパラメータをバックエンド側に渡し、当記事内容で実装するdevise_token_auth
を用いることでバックエンド側で認証処理が行われるため、ログインやログアウトなどが実現されるようになるのです!
新規登録
こちらの通り、新規登録で入力するパスは[ドメイン]/v1/auth
、HTTPメソッドはPOST
です。
Body
欄から、新規登録するユーザー情報として必要な
- password
をJSON形式で入力し、右上のSENDを押してください。HTTPリクエストが送られます。
(railsをサーバーで起動するのを忘れないで下さいね!)
すると、真ん中あたりに200 OK
というリクエストが成功したという表示がでます!
Headers
欄を見ると、レスポンスとしてprovider
やuid
などの値が返ってきていることが確認できましたね!
新規登録の成功です!
ログイン
入力するパスは[ドメイン]/v1/auth/sign_in
、HTTPメソッドはPOST
です。
Body
欄からログインに必要な
- password
をJSON形式で入力してください。
これも同様に成功し、以下のような結果が返ります。
サインアウト
パスは[ドメイン]/v1/auth/sign_out
、HTTPメソッドはDELETE
。必要なパラメータは、次の3つです。
- uid
- access-token
- client
先程解説したログイン処理の後、Response headers
欄に、今回のサインアウトで必要なパラメータのuid
、access-token
、client
が記載されてあります!
それらを参考に入力し、SENDするとサインアウトが実行されます。
こちらが成功画面。
アカウントの削除
もう慣れてきましたね!
パスは[ドメイン]/v1/auth/
、HTTPメソッドはDELETE
です。
- uid
- access-token
- client
を入力して下さい。
成功画面。