Ruby
Rails

API サーバに Basic 認証を設定し、クライアントから GET リクエストを送信する

はじめに

社内で「社内サービス間で API で連携し、一応認証には Basic 認証を使いたい」という話が挙がりました。そこで APi サーバとクライアントで実際にどうやって実現できるかを調べてみました。

方法

サーバ

http_basic_authenticate_with を使って、Basic 認証のユーザ名とパスワードを設定します。

app/controllers/api/v1/animes_controller.rb
module Api
  module V1
    class AnimesController < ApplicationController
      http_basic_authenticate_with name: 'nadeko', password: 'snake', only: :index

      def index
        @animes = Anime.all
      end
    end
  end
end

クライアント

以下は Ruby の例です。

require 'uri'
require 'net/http'

def request_with_basic_auth(url, username, password)
  uri = URI(url)
  request = Net::HTTP::Get.new(uri)
  request.basic_auth(username, password)

  Net::HTTP.start(
    uri.host, uri.port,
    use_ssl: true,
    # 次のオプションは localhost でオレオレ証明書を使っているので指定してます。
    # 通常 (正規の証明書の場合) は不要です。
    verify_mode: OpenSSL::SSL::VERIFY_NONE
  ) do |http|
    http.request(request)
  end
end

認証に成功した場合

url = 'https://localhost:8888/api/v1/animes.json'
response = request_with_basic_auth(url, 'nadeko', 'snake')
#=> #<Net::HTTPOK 200 OK readbody=true>

require 'json'
JSON.parse(response.body)
#=> [{"id"=>1, "year"=>2009, "title"=>"化物語"}, {"id"=>2, "year"=>2012, "title"=>"偽物語"}]

認証に失敗した場合

url = 'https://localhost:8888/api/v1/animes.json'
response = request_with_basic_auth(url, 'nadeko', 'cat')
#=> #<Net::HTTPUnauthorized 401 Unauthorized readbody=true>