0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SinatraでRackを使ったBasic認証を使ってみた。

Last updated at Posted at 2021-01-27

皆さんは認証には何を使用しますか?
認証と行っても、様々な認証方法があり、最近では外部サービスの認証システムを使用することも増えてきましたね。

今回は、そんな最新の認証ではなく、古くからあるbasic認証をsinatraで使ってみたので、それについてお話しします。

0. 環境とbasic認証を使用したサイトについて。

OS: Ubuntu 18.04.5 LTS
Ruby: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Rack: 2.0.7

サイトについては、2週間に一回30分程度しか使用しないサイトで、想定人数は6人です。
使用するユーザについては決まっているサイトで、部外者のアクセスを禁じたかったので、basic認証を使いました。

なぜ、basic認証を使ったのか。

basic認証を使った理由は、Rackを使ったbasic認証ではDBとの連携や、環境変数(env['REMOTE_USER'])からどのユーザがアクセスをしているかなどを確認できるため、自分で書く必要性がないと思ったからです。

1. 実装

Rubyファイルに以下のコードを追加することにより、アクセス時にbasic認証を求められます。

app.rb
use Rack::Auth::Basic do |username, password|
   username == 'Qiita' && password == 'LGTM'
end

仕組みはusernameとpasswordにユーザが入力したデータが代入されて、2行目の部分で合っているか認証を行います。

Rackの仕様状Rack::Auth::Basicの中身がTrueであればログイン、Falseであればもう一度認証が表示されるので、合っていればTrue,間違っていたらfalseを出すプログラムを作れば簡単にログイン機能を実装できます。

ActiveRecord

Rack::Auth::BasicとActiveRecordを組み合わせて使うことができます。

app.rb
use Rack::Auth::Basic do |username, password|
    member = Members.find_by(username: username)
    if member && member.authenticate(password)
        true
    else
        false
    end
end

このように、ActiveRecordのauthenticateを使って認証を作ることが可能です。
誰がログインしたいか取得する際はenv['REMOTE_USER']を使用することで確認できます。

if文を使用しないで、実装する方法(@scivolaさんに教えていただきました。)

app.rb
use Rack::Auth::Basic do |username, password|
   Members.find_by(username: username)&.authenticate(password)
end

2. 最後に

正直な話、SNSやショッピングサイトなどの第三者がユーザになるサービスや大規模な社内サービスに使うのはやめておいた方がいいと思いますが、小規模な社内サービスやローカル内でのサービスなどちょっとした認証に使いたい場合はいいと思います。

簡単にできるので、試してみるだけ試してみましょう。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?