How to authenticate in rack

概要

tDiaryをCGI/FastCGI環境で動かす場合は、WebサーバのBasic認証機能を使って認証を実現しています。一方、Rack環境で動かす場合には、Rackミドルウェアにて認証を実現します。ここでは、Rack環境での認証の導入方法を説明します。

認証方法

Rack環境では、以下の認証方法が利用できます。

Basic認証はCGI/FastCGI環境と同様に、 .htpasswd ファイルによる認証を提供します。外部サービス認証はOpenIDやOAuthなどの仕組みを使って、TwitterやGitHubなどの外部のサービスによる認証を提供します。

Basic認証の使い方

Basic認証では、パスワードを2つの方法で格納できます。通常はパスワードがハッシュ化されて保存される1の方法を利用してください。

  1. IDとパスワードを格納する.htpasswdファイルを作成する
  2. 設定ファイル (config.ru) にIDとパスワードを記述する

htpasswdコマンドを使って.htpasswdファイルを作成します。

htpasswd -cd .htpasswd username

-cオプションはファイルの新規作成、-dオプションは暗号化にCRYPT方式を利用します。現時点ではCRYPT方式にのみ対応しており、MD5やSHA1方式には対応していないため、必ず-dオプションを指定してください。

外部サービス認証

外部サービス認証は、OmniAuthという認証フレームワークを利用して実現しています。設定方法は、利用する外部サービスによって若干異なります。 ここでは、Twitter認証を利用する場合を例にとって説明します。

ライブラリを有効にする

利用する外部サービスに対応したライブラリを有効にします。Twitter認証では omniauth-twitter ライブラリを使用します。Gemfile.localにて以下の行が有効になっていることを確認してください。無ければ追加してください。

gem 'omniauth'
gem 'omniauth-twitter'

Twitter Appsへのアプリケーションの登録

Twitter 認証を使うためには、Twitter のサイトにてアプリケーションを登録する必要があります。Twitter Appsにアクセスし、以下の情報を入力して新しいアプリケーションを登録してください。

Name, Description, Websiteに設定した値は、Twitterのアプリ連携画面(認証画面)に表示されます。また、Callback URLを空欄にするとTwitter認証が動作しなくなります。任意のURLで良いので設定してください。

鍵とパスワードの取得と環境変数への設定

Twitterのサイトから鍵とパスワードを取得したら、鍵 (Consumer key) とパスワード (Consumer secret) をそれぞれ環境変数として設定します。

export TWITTER_KEY="your_consumer_key"
export TWITTER_SECRET="your_consumer_secret"

ここではbashの例を書きましたが、環境変数の設定方法は環境によって異なります。たとえばherokuの場合は heroku config コマンドを使用します。もし環境変数が設定できない環境であれば、 config.ru を直接書き換えてください。

編集画面へのアクセスを許可するアカウントの設定

日記の編集画面へのアクセスを許可するアカウントを設定します。 環境変数TWITTER_NAMEにログインを許可したい twitter のアカウント名(スクリーンネーム)を設定して下さい。

export TWITTER_NAME='your_twitter_screen_name'

日記の編集画面にアクセスすると、Twitterのログイン画面が表示されるようになります。編集画面へは your_twitter_screen_name で指定したアカウントのみがアクセスできます。

サポートしている外部サービス認証の一覧

Twitter

Gemfile.localの記述

gem 'omniauth'
gem 'omniauth-twitter'

環境変数の設定

export TWITTER_KEY="your_consumer_key"        # Consumer Key (API Key)
export TWITTER_SECRET="your_consumer_secret"  # Consumer Secret (API Secret)
export TWITTER_NAME="your_screen_name"        # アクセスを許可するアカウント名

KeyとSecretは Twitter Application Management にて取得できます。

Facebook

Gemfile.localの記述

gem 'omniauth'
gem 'omniauth-facebook'

環境変数の設定

export FACEBOOK_KEY="your_app_id"               # App ID
export FACEBOOK_SECRET="your_app_secret"        # App Secret
export FACEBOOK_EMAIL="your_email@example.com"  # アクセスを許可するアカウントのメールアドレス

IDとSecretは Facebook Developers にて取得できます。 設定画面にてWebsiteの「Site URL」と「Mobile Site URL」には、設置する日記のアドレスを指定してください。

Google

Gemfile.localの記述

gem 'omniauth'
gem 'omniauth-google-oauth2'

環境変数の設定

export GOOGLE_CLIENT_ID="your_client_id"          # クライアント ID
export GOOGLE_CLIENT_SECRET="your_client_secret"  # クライアント シークレット   
export GOOGLE_EMAIL="your_email@gmail.com"        # アクセスを許可するアカウントのメールアドレス

IDとシークレットは Google API にて取得できます。 設定画面にて「リダイレクトURL」には、設定する日記のアドレスの末尾に update.rb/auth/google_oauth2/callback を加えたものを指定してください。 日記のアドレスが http://diary.example.com/ の場合、リダイレクトURLは http://diary.example.com/update.rb/auth/google_oauth2/callback となります。

また、Google Developers Consoleの「APIと認証」にて、Google+ APIのステータスをonにしてください。

GitHub

Gemfile.localの記述

gem 'omniauth'
gem 'omniauth-github'

環境変数の設定

export GITHUB_KEY="your_client_id"          # Cliend ID
export GITHUB_SECRET="your_client_secret"   # Cliend Secret
export GITHUB_NAME="your_github_nickname"   # アクセスを許可するアカウント名

Cliend ID と Cliend Secret は、 New OAuth Application にて取得できます。 設定画面にて「Authorization callback URL」には、設置する日記のアドレスを指定してください。