以前twitter_oauthというgemを使ってTwitter認証を試したが、他のウェブサービスを使って認証もしてみたいので、OmniAuthというgemを使ってみることにする。
OmniAuthでググるとRailsを使ったサンプルばかりが引っかかって、よりシンプルな使い方がなかなか探しづらかったのだが、An example sinatra omniauth client appを参考にしたらできた。
アプリはHerokuを使ってデプロイする。言語はRuby、フレームワークはSinatraを使う。
OmniAuthのセットアップ
Gemfile
に必要なファイルを追加する:
Gemfile
source 'https://rubygems.org' |
- JSONは認証結果を分かりやすく表示するためだけに使っていて、実際には必要ない
omniauth-oauth2
を追加しないとNoMethod join for String
などというエラーが出てしまい、動かなかった
app.rb
require 'rubygems' |
- トップページにTwitterログインへのリンク(
/auth/twitter
)を表示してやる /auth/twitter
に飛ばすと、OmniAuthが勝手に認証処理を始めてくれる(Integrating OmniAuth Into Your Application)- 認証が成功すると
/auth/twitter/callback
に飛んできて、request.env['omniauth.auth']
に結果が入っているので、そこでユーザのTwitterアカウントの情報を取得できるrequest.env['omniauth.auth']['info']['nickname']
に名前、など
- 失敗した時は
/auth/failure
などに飛ばされる - omniauthはtwitter_oauthに比べて、自分でリクエストトークンやアクセストークンを処理しなくていいからすげー楽ちんだなぁ
ログアウト
アプリの認証を行った後トップページに行くと「ログアウト」ができるようにしている。 これは単にアプリ側のセッションに保存している情報ををクリアするだけで、認証先アプリとの 連携を切っているわけではない。連携を切るにはTwitter(や他のサービスの場合にはそのサイト)の 設定画面で行う必要がある。
他のウェブサービスでもログインできるようにする
OmniAuthではいろんなウェブサービスに対応できるようになっている(それぞれを戦略
と呼ぶ)。追加する手順は(例えばgithub
用には)、
- それぞれのウェブサービスで、認証を使うアプリを新規登録する(後述)
Gemfile
に必要なgemファイルを追加する(gem 'omniauth-github'
など)
Gemfile
を更新したらbundle install
を実行する
- Rubyスクリプトから読み込む(
require 'omniauth-github'
) OmniAuth::Builder
に登録する(provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
)
- ローカルテスト用に
export GITHUB_KEY='...'; export GITHUB_SECRET_KEY='...'
、herokuデプロイ用にheroku config:add GITHUB_KEY=...
でそれぞれの環境変数に定義してやる
ウェブサービスに認証アプリを登録
github
- Settings > Applicationsで、「Register new application」でアプリを作成
- アプリ名、ホームページURL、アプリの説明などは適当に
- 「Authorization callback URL」には、ローカルテスト中は
http://localhost:4567/auth/github/callback
を指定する
- Facebook Developersから、
[My Apps] > [+ Add a New App] > [ウェブサイト]でアプリを作成
- 名前を適当に設定
- ウェザードで順に設定する画面になるが、最上段の[My Apps]をクリックしてやるとアプリができている
- 作成したアプリを選んで、Settings > [+ Add Platform] > Website でアプリを登録する
Site URL
とMobile Site URL
の2つが登録できるので、例えば1つはローカルテスト用にhttp://localhost:4567/
を登録してやることもできる
Google+
- Google Developers Consoleで[プロジェクトを生成]で作成
- APIと認証 > 認証情報 > OAuth > 新しいクライアントIDを作成 で認証用のIDとシークレットキーを取得し、リダイレクトURLを登録できる