スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Facebook認証時、モバイル用ページを表示する

Oauth認証する際、APIに送るリクエストの末尾にdisplay="touch"をつけるとモバイル用のページが表示される。
通常のWEBページだったらdisplay=pageをつける(displayを付けないとこのページが採用されるようだ)

こんなかんじで

https://graph.facebook.com/oauth/authorize?response_type=code&client_id=xxxxxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Fhogehoge.com&scope=email%2Cphoto_upload%2Cpublish_stream%2Cuser_birthday&display=touch



エラーメッセージによれば、他にpopup, wapがあるようだ

Parameters: {"error"=>"invalid_request", "error_description"=>"Unsupported display: 'touch1'. Supported displays: popup, page, wap, touch"




facebook_oauthを使ってる場合、displayパラメタを付与できる作りになってないので、モンキーパッチを当てました。
facebook_oauth/lib/facebook_oauth/client.rb


15 15 client.auth_code.authorize_url(
16 16 :client_id => @application_id,
17 17 :redirect_uri => options[:callback] || @callback,
18 - :scope => options[:scope]
18 + :scope => options[:scope],
19 + :display => options[:display] || "page"
19 20 )
20 21 end



呼び出し側も修正

redirect_to client.authorize_url(:scope => 'emailとか', :display => "touch")




たぶんmoduleをオーバーライドするのが正解なんだけど、誰か方法教えてください><

FacebookのOAuth認証使ったアプリのテストを書く

facebook_oauth+Oauth2の場合

多分koalaでも基本一緒

Facebookへのトークン取得と自分の基本情報をfacebook_oauthから取得するようなプログラムのテストを書く場合

1.トークン取得
2.情報取得


の計2回Facebook APIを叩く必要がある。

まじめにやるならfoge_controller_test.rbに

require 'uri'
require 'net/http'


を追加して、FB側からのコールバック処理に

get :callback, { :code => "自分が使ってるホントのトークン"}


としてやれば動くはず。


ただ、アクセストークンは勿論固定ではないし、これだと自分自身のデータしか使えないのでユーザーごとに処理を変えるというようなことができない。

そこで、APIへのアクセスをダミー化してやる必要がある。

ダミー化するためにfakewebを使う

Gemfile

gem 'fakeweb'



テストコントローラーでfakewebを使う
hoge_controller_test.rb

require 'fakeweb'



先述の通りfacebook APIへの接続はトークン取得と情報取得2回発生するする。

なのでテストファイルには、まず1回目のアクセス用

FakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/oauth|,
{:body => "access_token=12345", :status => ["200","OK"]}
)


https://graph.facebook.com/oauth/access_tokenがアクセストークン取得用URLだが、前方一致で/oauthまででおk

2回目のアクセス(データ取ってくる用)

FakeWeb.register_uri(:any, %r|https://graph\.facebook\.com/me|,
{:body => JSON.generate(:id => 11111111, :name=>'ほげほげ'),
:status => ["200","OK"],
:content_type => "application/json"}
)


https://graph.facebook.com/meがデータ取得用APIなので、トークン取得用と2回に分けて記述する必要がある。

ハマったのはパラメータの方で、facebookのAPIは、リクエストに対してjson形式の値をbodyに入れて返すのだが、OAuth2がレスポンスヘッダに応じて処理を変えているため、明示的に:content_typeを指定してあげないといけない。
今回はfacebook_oauthを使ったが、たぶんこのへんはベースにOAuth2を使ってるkoalaでも一緒だと思う。

というか最近はfacebook_oauthは古くてkoalaが全盛だし、しかもさんざん調べてfakeweb使ったのにwebmockのほうがトレンドとかrubyってホント移り変わりが早い。


あとコントローラーに処理バリバリ書いてたのに、普通はモデルに書くもんだとかさ、どっかにそういうの書いておいてよマジで。

Rails+MongoでSexy Validationする方法

こんにちは。

最近社内ニートですることないのでRails+Mongoやってます。


Railsとか言ってるけどもともとPHPしかできないゆとりなんで、まず最初のRails+MySQLで色々つまづいたりもしてますが、私は元気です。

PHPer(しかも独自FW派)がRailsに惚れ込むまでのエントリを書きたいところですが、大長編になりそうなので今回はあんまり日本語のヘルプに引っかからなかったMongoでSexy Validationやる件についてはまりどころを書きます。

Rails3からSexy Validationが導入され、モデルに

validates :userid, :presence => true


みたいのを書けばバリデーションしてくれるようになりました。



なんて偉そうなこと書いてますが、そもそもRails2を知らないので、「一行書き足すだけでチェックしてくれるなんて超便利!」と素直に感動してますごめんなさい。

で、これを日本語化するには
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
をlocales/にぶち込めばいいっていうのが常識ですが、これだとフィールド名が日本語名にならないので別途ja.ymlで


  activerecord:
    attributes:
      hogehoge:
        userid: ユーザーアイディー


とかやります。


でもmongo_mapperはActiveRecordを使わないのでこれが使えません。
なのでまず使いたいモデルでValidationsが使えるよう、ActiveModel::alidationsをextendします。
たとえば今回はhogehogeモデルなので、モデルの先頭にこんな感じで追記します。


class Hogehoge
  include MongoMapper::Document
  extend ActiveModel::Validations ←追記した

  validates :userid, :presence => true ←Validation項目

  key :userid, String ←Mongoのドキュメント項目
end



次にlocale/ja.ymlのactiverecordの部分をmongo_mapperに書き換えます。(別にja.ymlじゃなくてもいい)


  mongo_mapper:
    attributes:
      hogehoge:
        userid: ユーザーアイディー



ほら、ちゃんと動いた!(画像略)

Rails+Mongoはあんまり日本語のヘルプがなくて困りますが、時間が余ってる時は英語のサイトを探しまくるのも楽しいです。

今回はstackoverflowの下のページを参考にしました。
http://stackoverflow.com/questions/3465481/whats-the-way-to-translate-model-attributes-in-rails-with-mongoid

これによればmongoid:で動いたよ!って言ってますがmongoidっていうgemがあるんですかね?


ゆとりだからわかんないや(^q^)



以上よろしくお願いいたします。

このカテゴリーに該当する記事はありません。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。