皆さんは認証には何を使用しますか?
認証と行っても、様々な認証方法があり、最近では外部サービスの認証システムを使用することも増えてきましたね。
今回は、そんな最新の認証ではなく、古くからある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認証を求められます。
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を組み合わせて使うことができます。
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さんに教えていただきました。)
use Rack::Auth::Basic do |username, password|
Members.find_by(username: username)&.authenticate(password)
end
2. 最後に
正直な話、SNSやショッピングサイトなどの第三者がユーザになるサービスや大規模な社内サービスに使うのはやめておいた方がいいと思いますが、小規模な社内サービスやローカル内でのサービスなどちょっとした認証に使いたい場合はいいと思います。
簡単にできるので、試してみるだけ試してみましょう。