Rubyでソーシャルアカウントでの認証機能を実装しようと調べるとだいたいRails + Deviseという組み合わせのサンプルが見つかる。 Deviceでもいいんだけど、ジェネレータを使ったりだとか、Rails newしなきゃいけなかったりだとかでツールを使うために覚えなきゃいけないことが多いので今回は遠慮。

単純にソーシャルアカウントで認証することさえできればいいいので、「sinata omniauth」でググってみると調度よいサンプルがあったので それを写経してみた。

Gemfile

# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem "sinatra"
gem "sinatra-contrib"
gem "omniauth"
gem "omniauth-twitter"
gem "omniauth-facebook"
gem "omniauth-google-oauth2"
gem "omniauth-github"

App.rb

require "sinatra"
require "sinatra/reloader"
require "omniauth"
require "omniauth-facebook"
require "omniauth-google-oauth2"
require "omniauth-github"
require "json"

class SinatraOmniAuth < Sinatra::Base
  configure do
    set :sessions, true
    set :inline_templates, true
  end

  use OmniAuth::Builder do
    provider :facebook,       ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_APP_SECRET"]
    provider :google_oauth2,  ENV["GOOGLE_APP_ID"],   ENV["GOOGLE_APP_SECRET"]
    provider :github,         ENV["GITHUB_APP_ID"],   ENV["GITHUB_APP_SECRET"]
  end

  get "/" do
    erb <<-"EOS"
      <a href='/auth/facebook'>Login with Facebook</a><br>
      <a href='/auth/google'>Login with Google</a><br>
      <a href='/auth/github'>Login with Github</a>
    EOS
  end

  get "/auth/:provider/callback" do
    @provider = params[:provider]
    @result = request.env["omniauth.auth"]
    erb <<-"EOS"
      <a href='/'>Top</a><br/>
      <h1><%= @provider %></h1>
      <pre><%= JSON.pretty_generate(@result) %></pre>
    EOS
  end
end

SinatraOmniAuth.run! if __FILE__ == $0

あとは、bundle installしてapp.rbを実行すれば動く。 実はGoogleでの認証が上手く行っていないのだけど。。。何故か"/auth/google"宛にコールバックが返ってくる。正しくは"/auth/google_oauth2/callback"なのだけど。

まぁこれは後々調査するということで、とりあえず作成したコードはGithubにコミット。

SinatraOmniauth

参考になった記事

http://qiita.com/tyfkda/items/38da1bb173775f70a15a