2012.08.18

Catalyst で Facebook の OAuth を使う

ライブラリを使わずにやりたかったので、PerlでOAuth 2.0を使ってみた を参考にした。
こちらのページの Plack::Request, Plack::Response を使わずに、Catalyst の $c->res を使った感じ。

http://localhost:3000/auth というページが Facebook Developers の Site URLに登録してあるとする。
/auth というパスに処理を作るため、
 $ perl script/hello_create.pl controller Auth
で Controller を作り、lib/Hello/Controller/Auth.pm を編集する。

1: Facebookページにリダイレクトして、Facebookにログインし、このアプリのアクセスを許可する
2: $redirect_uri に codeパラメータ付きで戻ってくる
3: token を取得するため、codeパラメータを使用して再び Facebook API にアクセスする
4: その token を使用すると、Facebookのその人の情報にアクセスできる

sub index : Path :Args(0) {
    my ( $self, $c ) = @_;

    my $app_id = '(Facebook Developers の App ID)';
    my $app_secret = '(Facebook Developers の App Secret)';
    my $authz_endpoint = 'https://www.facebook.com/dialog/oauth';
    my $token_endpoint = 'https://graph.facebook.com/oauth/access_token';
    # Facebook Developers の Website with Facebook Login の Site URL
    my $redirect_uri = 'http://localhost:3000/auth';

    # 2) get authorization code
    if ( my $code = $c->req->param('code') ) {

        # 3) get access token
        my $uri = URI->new($token_endpoint);
        $uri->query_form(
            client_id     => $app_id,
            client_secret => $app_secret,
            redirect_uri  => $redirect_uri,
            code          => $code
        );
        my $ua     = LWP::UserAgent->new;
        my $r      = $ua->get($uri);
        my %params = ();
        for my $pair ( split( /&/, $r->content ) ) {
            my ( $key, $value ) = split( /=/, $pair );
            $params{$key} = $value;
        }
        my $token = $params{access_token};

        # 4) get protected resources
        if ($token) {
            my $url = 'https://graph.facebook.com/me/friends';
            (略)
            $c->response->body($html);

        } else {
            $c->response->body('fail to get token');
        }

    } else { # 1) redirect to authorization endpoint

        my $uri = URI->new($authz_endpoint);
        $uri->query_form(
            client_id    => $app_id,
            redirect_uri => $redirect_uri,
        );
        $c->res->redirect($uri);
    }
}

理解のため全コードを Controller に書いてるけど、実際に使うんだったらうまいことキレイにすべし。


2012.08.18, 23:59 / Catalyst, OAuth
2012.08.18

Catalyst インストール

会社では Catalyst を使ってるので、家マシンにも入れてみた。

Install Catalyst
1. sudo apt-get install build-essential
2. Ubuntuソフトウェアセンターから libcatalyst-perl をインストール
3. sudo perl -MCPAN -e ‘install Task::Catalyst’
(3でいろいろインストールされたので2が足りなかったのかもしれない)

あとは、
$ catalyst.pl Hello (Helloはプロジェクト名)
$ cd Hello/script
$ perl hello_server.pl

ついでに Eclipse で Perl を使えるようにEPICというプラグインを入れた。
http://www.epic-ide.org/updates/


2012.08.18, 20:40 / Catalyst
Catalyst インストール はコメントを受け付けていません
2012.08.18

Ruby on Rails で Facebook の OAuth を使う

Ruby on RailsでfacebookのOAuth認証を実装する を参考にした。
facebook_oauth プラグインを使ってラクしたものだ。

gem のインストール
$ sugo gem install oauth
$ sugo gem install oauth2
$ sudo gem install facebook_oauth

バージョンを指定せずに最新をインストールして大丈夫だった。
oauth v0.4.6
oauth2 0.8.0
facebook_oauth 0.3.0

ソースコードの編集
$ rails generate controller Users index callback

– controller/users_controller.rb

class UsersController < ApplicationController
   CALLBACK_URL = "Facebook Developers の Website with Facebook Login の Site URL"
   CONSUMER_KEY = "Facebook Developers の App ID"
   CONSUMER_SECRET = "Facebook Developers の App Secret"
   
   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

– views/users/index.html.erb
<%= link_to 'OAuth認証', '/users/oauth' %>

– views/users/callback.html.erb
<%= @client.me.info %>

以上は書いてあったとおり。

追加で以下の作業が必要。
– config/routes.rb

get "users/oauth"

Routing Error : No route matches [GET] “/users/oauth” が出たので追加してみた。

– Gemfile

gem 'facebook_oauth'

NameError : uninitialized constant UsersController::FacebookOAuth が出たので追加してみた。
ただ、facebook_oauth が Heroku にないのか、Heroku の git にあげようとするとエラーになるという問題が・・・


2012.08.18, 19:46 / OAuth, Rails
Ruby on Rails で Facebook の OAuth を使う はコメントを受け付けていません