RailsのコントローラでAPI認証 / RSpecでテスト


Ruby on RailsでAPIトークンを発行して認証を行うまでと、RSpecでのテストの実装のサンプルです。

🏈 Railsプロジェクトの準備

# プロジェクトの作成
rails new auth_test --api -d postgresql
# scaffoldで新しいモデルを生成
bundle exec rails g scaffold Article title:string content:text
bundle exec rake db:setup
bundle exec rake db:migrate

😀 コントローラ側の実装

app/controllers/application_controller.rbにtokenの認証を実装します。

class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :authenticate
protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
token == ENV['API_TOKEN']
end
end
end

🤔 認証のテスト

HTTPのリクエストのヘッダにトークン情報を渡します。

# サーバ起動
API_TOKEN=HOGE rails s
# 認証成功時
curl -s -X GET -H 'Authorization: Bearer HOGE' -H 'Content-Type:application/json' http://0.0.0.0:3000/articles/1 | jq .
{
"id": 1,
"title": "test-title",
"content": "test-content",
"created_at": "2017-07-09T08:44:55.054Z",
"updated_at": "2017-07-09T08:44:55.054Z"
}
# 認証失敗時
curl -X GET -H 'Authorization: Bearer FUGA' -H 'Content-Type:application/json' http://0.0.0.0:3000/articles/1
HTTP Token: Access denied.

🚌 RSpec

認証をサポートするモジュールspec/support/authentication_helper.rbを作成。

module AuthenticationHelper
def authenticate
@env ||= {}
@env['HTTP_AUTHORIZATION'] = "Bearer #{ENV['API_TOKEN']}"
end
end

spec/rails_helper.rbに以下を追加。

RSpec.configure do |config|
config.include AuthenticationHelper, type: :request
end

Request Specでは次のように記述します。

it 'should not allow access' do
authenticate
GET '/articles/1', {}, @env
end

🐞 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)