Rails6で標準のトークン認証をする

September 03, 2022

確認環境

$ bundle exec ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]
$ bundle exec rails --version
Rails 6.0.4.6

トークンの準備

$ rails g model MyToken token:string
$ rake db:migrate
$ rails c
Loading development environment (Rails 6.0.4.6)
irb(main):001:0> MyToken.create(token: 'mytokennnn')

トークン認証の処理

$ rails g controller MyApi

config/routes.rb

Rails.application.routes.draw do
  get "/myapi/users" => "my_api#users"
end

app/controllers/my_api_controller.rb

class MyApiController < ApplicationController
  include ActionController::HttpAuthentication::Token::ControllerMethods
  before_action :authenticate

  def users
    # SampleUser は返却したいデータに置き換えてください
    # 動作確認のため、固定値を返すようにしてもいいです。
    # render json: { data: '固定データ' }
    render json: { data: SampleUser.all }
  end

  def authenticate
    authenticate_or_request_with_http_token do |token, options|
      Rails.logger.fatal(token)
      Rails.logger.fatal(options)

      auth_user = MyToken.find_by(token: token)
      auth_user.present?
    end
  end
end

curl で確認

正しいトークン

$ curl -X GET -H 'Authorization: Token mytokennnn'  http://localhost:3000/myapi/users

{"data":[{"id":1,"name":"new name","created_at":"2022-08-24T15:34:58.690Z","updated_at":"2022-08-27T06:18:46.114Z"}]}

間違っているトークン

$ curl -X GET -H 'Authorization: Token wrongMytokennnn'  http://localhost:3000/myapi/users

HTTP Token: Access denied.

参考


SHARE

Profile picture

Written by tamesuu