2011年12月13日火曜日

OAuth2.0 Facebookと連携してみる

OAuth2.0を使用して、Facebookと連携するrailsアプリを作成する。
なお、クライアントのサンプルアプリでは、Facebookが公開しているOAuth2.0用ライブラリを使用する(実は、Facebookのライブラリでは、OAuth2.0ライブラリを呼び出している)。

①以下のサイトにアクセスし、アプリを登録する。
https://developers.facebook.com/apps
Client IDとClient secretが作成される。



②gemコマンドを使用し、Facebookが公開しているOAuth2.0ライブラリをインストールする。

C:\Users\yasu\clientapp\facebook>gem install facebook_oauth
Fetching: facebook_oauth-0.3.0.gem (100%)
Successfully installed facebook_oauth-0.3.0
1 gem installed
Installing ri documentation for facebook_oauth-0.3.0...
Installing RDoc documentation for facebook_oauth-0.3.0...


③railsのサンプルアプリケーションを作成する。
c:\Users\yasu\clientapp>rails new facebook
       exist
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/assets/images/rails.png
      create  app/assets/javascripts/application.js
      create  app/assets/stylesheets/application.css
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  app/mailers/.gitkeep
      create  app/models/.gitkeep
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/initializers/wrap_parameters.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  lib/assets
      create  lib/assets/.gitkeep
      create  log
      create  log/.gitkeep
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  script
      create  script/rails
      create  test/fixtures
      create  test/fixtures/.gitkeep
      create  test/functional
      create  test/functional/.gitkeep
      create  test/integration
      create  test/integration/.gitkeep
      create  test/unit
      create  test/unit/.gitkeep
      create  test/performance/browsing_test.rb
      create  test/test_helper.rb
      create  tmp/cache
      create  tmp/cache/assets
      create  vendor/assets/stylesheets
      create  vendor/assets/stylesheets/.gitkeep
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
         run  bundle install
Fetching source index for http://rubygems.org/
Using rake (0.9.2.2)
Using multi_json (1.0.4)
Using activesupport (3.1.2)
Using builder (3.0.0)
Using i18n (0.6.0)
Using activemodel (3.1.2)
Using erubis (2.7.0)
Using rack (1.3.5)
Using rack-cache (1.1)
Using rack-mount (0.8.3)
Using rack-test (0.6.1)
Using hike (1.2.1)
Using tilt (1.3.3)
Using sprockets (2.1.2)
Using actionpack (3.1.2)
Using mime-types (1.17.2)
Using polyglot (0.3.3)
Using treetop (1.4.10)
Using mail (2.3.0)
Using actionmailer (3.1.2)
Using arel (2.2.1)
Using tzinfo (0.3.31)
Using activerecord (3.1.2)
Using activeresource (3.1.2)
Using ansi (1.4.1)
Using bundler (1.0.21)
Using coffee-script-source (1.1.3)
Installing execjs (1.2.11)
Using coffee-script (2.2.0)
Using rack-ssl (1.3.2)
Using json (1.6.3)
Using rdoc (3.11)
Using thor (0.14.6)
Using railties (3.1.2)
Using coffee-rails (3.1.1)
Using jquery-rails (1.0.19)
Using rails (3.1.2)
Using sass (3.1.11)
Using sass-rails (3.1.5)
Installing sqlite3 (1.3.5)
Using turn (0.8.3)
Using uglifier (1.1.0)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem
is installed.
c:\Users\yasu\clientapp>cd facebook
c:\Users\yasu\clientapp\facebook>rails generate controller Client index callback
      create  app/controllers/client_controller.rb
       route  get "client/callback"
       route  get "client/index"
      invoke  erb
      create    app/views/client
      create    app/views/client/index.html.erb
      create    app/views/client/callback.html.erb
      invoke  test_unit
      create    test/functional/client_controller_test.rb
      invoke  helper
      create    app/helpers/client_helper.rb
      invoke    test_unit
      create      test/unit/helpers/client_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/client.js.coffee
      invoke    scss
      create      app/assets/stylesheets/client.css.scss

④client_controller.rb(C:\Users\yasu\clientapp\facebook\app\controllers配下)を修正する。
----------------------------------------------------------
require "oauth2"
require 'facebook_oauth'
class ClientController < ApplicationController

  # コールバック先URL
  CALLBACK_URL    = "http://openam.yasuyasu.com:3001/client/callback"
  # CONSUMER KEY
  CONSUMER_KEY    = "id" ←★Client IDを設定
  # CONSUMER SECRET
  CONSUMER_SECRET = "secret" ←★Client secretを設定

  # サンプルアプリがFacebookからアクセストークンを取得する際、
  # クライアント側でサーバ証明書を検証する(デフォルトの設定)。
  # (よくない対応だが、)ここではサーバ証明書を検証しないようにする。
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

  def index
  end

  def oauth
    client = FacebookOAuth::Client.new(
      :application_id     => CONSUMER_KEY,
      :application_secret => CONSUMER_SECRET,
      :callback           => CALLBACK_URL
    )
    # 認可コードの要求
    redirect_to client.authorize_url
  end

  def callback
    @client = FacebookOAuth::Client.new(
      :application_id     => CONSUMER_KEY,
      :application_secret => CONSUMER_SECRET,
      :callback           => CALLBACK_URL
    )
    # アクセストークンの取得
    @client.authorize(:code => params[:code])
  end
end
----------------------------------------------------------

⑤index.html.erb(C:\Users\yasu\clientapp\facebook\app\views\client配下)を修正する。以下を追加する。
<%= link_to 'OAuth', '/client/oauth' %>

⑥callback.html.erb(C:\Users\yasu\clientapp\facebook\app\views\client配下)を修正する。以下を追加する。
<%= @client.me.info %>

WEBrickを起動する。

C:\Users\yasu\clientapp\facebook>rails  server -p 3001
=> Booting WEBrick
=> Rails 3.1.2 application starting in development on http://0.0.0.0:3001
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-12-12 23:02:08] INFO  WEBrick 1.3.1
[2011-12-12 23:02:08] INFO  ruby 1.9.3 (2011-10-30) [i386-mingw32]
[2011-12-12 23:02:08] INFO  WEBrick::HTTPServer#start: pid=6300 port=3001



 ブラウザで「http://openam.yasuyasu.com:3001/client/index」にアクセスする。Facebook側でサンプルアプリと連携してよいかを確認されるため、認可する。
以下の画面が表示されれば連携が完了である。





0 件のコメント: