2011年8月12日金曜日

omniauthによる認証part2 Yahoo、Google、OpenID、MyOpenID

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

●追記 日付:2012/2/6
http://yorunocafe.blogspot.com/2012/02/rails-omniauth.html

以下のやり方はちょっと古いみたいです。



前回のwitter認証に続いて、Yahoo、Google、OpenID、MyOpenIDの認証をやってみました。
こちらが試したデモページです デモページ
※削除しました。

ベースは前の記事のコードを流用しています。前回のtwitter認証の記事
追加で変更した箇所を書いていきたいと思います。

①configのinitializeのomniauth.rbに Yahoo、Google、OpenID、MyOpenIDの場合のコードを定義


Rails.application.config.middleware.use OmniAuth::Builder do
# you need a store for OpenID; (if you deploy on heroku you need Filesystem.new('./tmp') instead of Filesystem.new('/tmp'))
  require 'openid/store/filesystem'
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
    # generic openid
   provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'openid'
   # dedicated openid
   provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id'
   # provider :google_apps, OpenID::Store::Filesystem.new('./tmp'), :name => 'google_apps'
   # /auth/google_apps; you can bypass the prompt for the domain with /auth/google_apps?domain=somedomain.com
  #yahooJapan :identifier => 'yahoo.co.jp'
   provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'yahoo', :identifier => 'yahoo.co.jp'
   #provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'yahoo', :identifier => 'yahoo.com'
   provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'myopenid', :identifier => 'myopenid.com'
end


※場合によってはemail列をDBに追加してもいい。今回はなし。

②ビューにYahoo、Google、OpenID、MyOpenIDのサインインのリンクを追加

  <p>add other singin</p>
    <%= link_to "Sign in with Google", "/auth/google" %><br/>
    <%= link_to "Sign in with Yahoo", "/auth/yahoo" %><br/>
    <%= link_to "Sign in with OpenID", "/auth/openid" %><br/>
    <%= link_to "Sign in with MyOpenID", "/auth/myopenid" %><br/>
 
※コールバック後のcreateのルートは変えずにそのままでいける

これで完了です。
GoogleもYahooも認証できました。
OpenIDとMyOpenIDはアカウントもってなかったのでやってないけど問題ないでしょう(笑


試してるなかでいくつかはまった点があったので書いておきます。


①アカウントサインイン時に以下のエラーがでる

request-URI Too Large
WEBrick::HTTPStatus::RequestURITooLarge

URIが大きすぎるというエラーですが
解決法として
1.mongrelだと問題ないらしい。→mongrelに変更する
もしくは
2.WEBrickのままで解決する場合 
ruby-directory/lib/ruby//webrick/httprequest.rb の246行目らへんの
1024→2048にかえる。ruby中身のコードをかえるため自己責任で

def read_request_line(socket)
      @request_line = read_line(socket, 2048 ) if socket
      if @request_line.bytesize >= 2048  and @request_line[-1, 1] != LF
        raise HTTPStatus::RequestURITooLarge
end

ここを参照しました。 https://github.com/intridea/omniauth/issues/43

②yahooでサインインするとアメリカのyahoo本家に飛んでしまう
initializersのomniaut.rbの:identifireをyahoo.com→yahoo.co.jpにかえる
provider :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'yahoo', :identifier => 'yahoo.co.jp'

③openidでルートエラーになる場合
リンクが/auth/openid になってることを確認(open_idではない)
※元からだったのか書き間違えなのかはまってしまった


以上です。

OmniAuth.を使うと簡単に認証できるのがいいですね。
こちらでアカウント作成機能を付けなくてもいいのが楽です。
ユーザーももってるアカウントを使えたほうがいいですしね。
Deviseと組み合わせて使う方法もあるみたいで次はこれを試してみたい。

0 件のコメント:

コメントを投稿