ホーム > タグ > Ruby

Ruby

warden+railsでパスワード認証

今作っているサービスが後々、OAuth、OpenIDあたりにも対応することになるかもしれないので、そのあたり柔軟に対応できそうなwardenを試してみました。

必要なgemはwardenrails_wardenの2つ。

Userモデルは以下のような感じで。

次にgithubのページを参考にconfig/initializers/warden.rbを追加します。今回はパスワードで認証をしたいのでpasswordのstrategyを自分で追加します。(と言ってもほとんどサンプルと同じ)

この後はUser.authenticateの中身をfind_by_login_and_passwordとかで実装してもいいのですが、それだとパスワードが平文になってしまうのでrestful_authenticationのコードを少し拝借することにします。


includeいているものがrestful_authenticationのコードです。適当にコピーしてlibにでも置いておくといいと思います。

これでpasswordとpassword_confirmationによるパスワードの確認、User#save時にパスワードをハッシュ化して保存してくれます。

後、一応ログイン処理するコントローラも載せておきます。

unauthenticatedが認証に失敗したときに遷移するアクションです。

正直、パスワード認証のことだけ考えるとちょっと面倒な気もします。パスワードの暗号化も自分で書かなければいけないし。ただ、上記のようにmoduleを別途用意しておけば作業の手間自体は結構軽減されので、そこまでは問題にならないかもしれません。

Strategyまわりについてはほとんど検証していませんが、色々と融通は効きそうな気もします。この辺は追々。

後はdeviseというwardenベースのライブラリもあるのでこれを試すのもありかなという気はします。ただ、deviseは色々とやり過ぎというか、多機能すぎてよくわからない感じもしますが・・・

CentOS 5.4(EC2)にApache+PassengerでRails環境作る

後々、また参照する気がするので記録しておく。この手の環境構築系のドキュメントってWikiかなんかにみんなで情報集めたらそこそこ便利そうな気がするのだけどどうだろう。

Ruby、RubyGemsのインストール

yumでRubyをインストールしようとすると、1.8.5が入ってしまうので仕方なくソースからインストール。

$ cd /usr/local/src
$ sudo wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.gz
$ sudo tar zxvf ruby-1.8.7-p249.tar.gz
$ cd ruby-1.8.7-p249
$ sudo ./configure
$ sudo make
$ sudo make install

$ cd /usr/local/src
$ sudo wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
$ sudo tar zxvf rubygems-1.3.6
$ cd rubygems-1.3.6
$ sudo ruby setup.rb

この時点で一応RubyGemsもインストール出来てはいるけれど、実際に使おうとするとエラーが発生する。どうやらzlibが入っていなかった模様。

$ sudo yum install zlib-devel
$ cd /usr/local/src/ruby-1.8.7-p249/ext/zlib
$ sudo extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
$ sudo make
$ sudo make install

MySQLのインストール

こっちはyumからサクッとインストール。

$ sudo yum install mysql mysql-server mysql-devel
$ sudo /etc/initd.mysqld start

my.cnfの設定は/usr/share/mysql/以下からコピーしてきたりとか適当に。ユーザの設定とかも適当に。

Apache+Passenger

まずはApacheをサクッとインストール。

$ sudo yum install httpd-devel

そしてPassengerのインストール。

$ sudo gem install passenger
$ sudo passenger-install-apache2-module

ここでまたしてもエラー。どうやらOpenSSLが入っていないとかなんとか。

$ sudo yum install openssl-devel
$ cd /usr/local/src/ruby-1.8.7-p249/ext/openssl
$ sudo ruby extconf.rb
$ sudo make
$ sudo make install

これで無事Passengerがインストール出来る。

$ sudo passenger-install-apache2-module

最低限のPassengerの設定。この設定の内容はpassenger-install-apache2-moduleを実行した時に表示されているので確認しておくこと。

$ sudo vi /etc/httpd/conf.d/passenger.conf
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11
PassengerRuby /usr/local/bin/ruby

あとはhttpd.confのDocumentRootをRailsのpublicディレクトリにすればOK。

$ sudo vi /etc/httpd/conf/httpd.conf
DocumentRoot /path/to/rails/public

本当に最低限だけどとりあえずこれでPassengerでRailsを動かすことが出来るはず。ApacheやMySQLの自動起動はchkconfigを設定すればよい。Passengerの細かい設定はPassenger users guidを参考に。

Gentoo+Passenger+rvm

rvmのインストール

rvmのインストールはgithubからやった。(rvm: Ruby Version Manager – Ways to install rvm.)

使うバージョンは、1.8.7。

rvm install 1.8.7
rvm 1.8.7 --default

Passengerのインストール

Gentooだと、Passengerはmaskされてるっぽいので/etc/portage/package.keywordsにwww-apache/passenger追加して、emerge passengerする。

Apacheの設定

/etc/conf.d/apacheに”-D PASSENGER”追加。

/etc/apache/vhosts.d/にvirtualhost追加。

<VirtualHost *:80>
  ServerName hoge.example.jp
  DocumentRoot /path/rails/public
  RailsBaseURI /
  <Directory /path/rails/public>
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

/etc/apache2/modules.d/30_mod_passenger.confを修正。

PassengerRuby /home/ukstudio/.rvm/bin/ruby-1.8.7-p249
PassengerRoot /home/ukstudio/.rvm/gems/ruby-1.8.7-p249/gems/passenger-2.2.9/

あとはapacheを再起動すればOK。

なんか、rvmに–passengerオプションがあるのでそれを使うよう設定すれば、気軽にPassengerで使うrubyを返られる気がしなくもない。そこらへんはそのうちやる。

Google Data APIの認証をClientLogin + Rubyで

とりあえずGoogle Mapで。他のサービスもservice変数を書き換えれば認証までは通るはず。クエリのPasswdをPasswordにしてて結構はまった。Unix文化め。

参考: Google Data API – Google Code

opensocial-ruby-clientでmixiのRESTful APIを使ってみた

opensocial-ruby-clientのドキュメントがあまり無くて結構苦労した。

まず、opensocial-ruby-clientはRailsありきなんだけど、そこで修正が必要。

これは自分のプロフィールとマイミクとかをとってくるコード。mixi用のConnectionがないので自分で作る必要があり。

TDD Boot Campに参加してきました

これまた、割と今更なエントリ。当日は@t_wadaさんのお誘いでRubyグループのコーチ役として参加したけどあまりコーチらしいことしてないな・・・申し訳ない。

TDD Boot Camp(以下tddbc)では、午前中に @t_wada さんと Lasse氏 の講演、午後は各言語ごとにグループを作りペアプログラミング。朝から夜にかけてがっつりなイベントだった。TDDをやりたくてもやり方がわからない、やってみたはいいけど上手くいかないって人にはとてもいいイベントだったんじゃなかろうか。実際、僕も色々と得るものがあった。

とりあえず、当日のお題をあとで自分で書いたものを晒しておく。スレッドセーフ以外の仕様変更まで取りこんである。

http://github.com/ukstudio/LRUCache

これは1つのクラスにまとめてあるけど、結構複雑な感じになってきているので、CacheItemみたいな感じでもう1つ別のクラスを作ってそっちにキャッシュの保存期限とか持たせた方がいいかもしれない。仮にここからクラスを抽出するとしてこれだけテストが書いてあればそんなに苦労せずに抽出できるはず。テストがあるからこそクラスを抽出させるという変更も恐れることなく対応できる。

Fixnum#seconds_laterはLasse氏のを参考にした。個人的にStubの影響をブロックの中だけに限定させたかったので少し修正してある。あとは、Rspecの機能で言うと、subjectやカスタムマッチャを使ってる。それぞれそんなに難しくないので使ってみることをおすすめする。

最後にちょろっと感想を伸べておくと、tddbcはとても素晴しいイベントだったと思う。 @ebackyさんや、来日してくれたLasse氏をはじめ、スタッフのみなさん、今回このようなイベントを開催してくれて本当にありがとうございました。また参加された皆様からも色々な気づきを得られました。ありがとうございます。

僕はTDDでプログラマの階段を更に1歩登れたように思う。ハッキリ言って、TDDを知る前と知った後のコードにはかなりの差がある。なにより、TDDでのプログラミングは楽しい。tddbcに参加された皆様もこの楽しさを知ってもらえればと思う。

RSpecでprivateメソッドをテストする

Object#send(__send__)ならメソッドの呼び出し制限に関わらずメソッドを呼び出すことが可能なので、privateメソッドもテスト可能。

確か、1.9以降はメソッド呼び出し制限がObject#sendにも影響するとどこかで見た記憶があるのだけど結局そうはなっていないみたい。

1.9.1、1.8.7で確認済み。

ちなみにオマケ。

Pythonはメソッド名の前にアンダースコアを2つけるとprivateなメソッドになるのだけれど、実際のところ別名でメソッドを定義してそちらを呼び出してるっぽい。別名で定義された方はprivateではないので、そちらを呼び出してテストすることが可能。

他にもJavaだったらsetAccessible(True)を実行すればpublicなメソッドに変更されるのでテスト可能。と聞いただけで確認はしていない。

Ruby Freaks Loungeに記事を書きました

第21回 Railsアプリの受け入れテストをCucumberで書こう

榊さんの紹介で、Ruby Freaks Loungeに記事を書かせて頂きました。ありがとうございます。内容はCucumberについて。割と自分のブログに書いた内容や、WEB+DBのRails特集で書いたことと被ってるかな。

あともう一回、記事を書く予定なのでそっちでは実際にRailsアプリのテストをCucumberで書く記事にするつもり。チュートリアル形式的な。

感想とか突っ込みとかあれば教えて頂けるとうれしいです。次回もお楽しみに。

Ruby1.8.7とRuby1.9.2を共存させる

現在は、以下の方法よりrvmを使うことをオススメします。 10/05/28 追記

ローカルに開発環境としてRuby1.8.7とRuby1.9.2を共存させる方法。

Rubyのインストール

まずはRubyの処理系をインストール。ruby-lang.orgから適当に落とす。今回はruby 1.8.7-p174とruby 1.9.2-preview1を使用。

まず、Ruby1.9.2から。

$ ./configure --prefix=/Users/uk/local --program-suffix=-1.9.2
$ make
$ make install

–prefixでインストール箇所を指定。自分の$HOME以下のどこかにいれるのが最近のマイブーム。この後でてくるgemも$HOME以下。Rubyはともかくgemは$HOME以下を推奨する。ある程度有名なライブラリならいいが、適当な野良ライブラリをインストールするにはこちらの方が安心な為。

–program-suffixを指定するとインストールしたバイナリの後ろに指定した文字列を付加できる。この例だと「ruby-1.9.2」となる。他の処理系と分けるためこの指定は必須。

次に同じ要領で1.8.7もインストール。やることは同じ。

$ ./configure --prefix/Users/uk/local --program-suffix=-1.8.7
$ make
$ make install

これでそれぞれのバイナリが/Users/uk/local/binに入っている状態となる。

RubyGems

次にgemの設定。Ruby1.9からはgemが標準で入っている為、インストールは必要ない。ただバージョンが1.3.4なのでアップデートしておくといいだろう。

1.8.7は別途gemをインストールする。RubyForgeにプロジェクトがあるのでそこからダウンロードしてくる。

$ ruby-1.8.7 setup.rb

それぞれのgemのenvを見ておくと、インストールしたライブラリがどこに保存されるかわかる。

$ gem-1.9.2 env
$ gem-1.8.7 env

それぞれ、GEM PATHSの先頭が/Users/uk/local/lib/ruby/gems/1.8と/Users/uk/local/lib/ruby/gems/1.9.1(何で1.9.2じゃないのかはわからん)になっているはずだ。今後、gemを使ってライブラリをインストールするときはsudoは必要ない。

シンボリックリンク

この時点でRuby1.9.2とRuby1.8.7がそれぞれ使える状態になってはいるが、いちいちバージョンを指定するのも面倒なので、シンボリックリンクで対応する。riとかも必要に応じて作る。

$ ln -s ~/local/bin/ruby-1.8.7 ~/local/bin/ruby
$ ln -s ~/local/bin/irb-1.8.7 ~/local/bin/irb
$ ln -s ~/local/bin/gem-1.8.7 ~/local/bin/gem

Ruby1.9.2を使いたいときは、一度シンボリックリンクを消し、再度作りなおす。

とは言え、その作業を手動で行うのは手間なのでスクリプトで対応するのがオススメ。5分ぐらいで書いたスクリプトをgistに貼っておいた。実行権限を与えて、引数にバージョンを与えると使えるはずだ。PATHとCMDは適当に書き換えること。そのうちもうちょっとマシなものに書き直すかも。

まとめ

とりあえず、こんな感じでRuby1.9.2とRuby1.8.7を共存させてみた。いくつか、気になる点があって例えばgemでRailsをインストールするとシェバングが「#!/Users/uk/local/bin/ruby-1.9.2」となっており、シンボリックリンクを用意しただけではダメな時もある。その時はとりあえず諦めて以下の様に実行している。

$ ruby -S Rails hoge

実際にこの環境で開発するのはこれからなので、もしかしたらそのうち色々な問題もでてくる可能性はあるが、とりあえずこの環境でやってみようと思う。

RailsからOAuthを利用してTwitterにポストする

OAuthの細かい説明は抜き。

まず、OAuthを使うためにはTwitterでアプリケーションの登録が必要なので、http://twitter.com/oauth_clientsで登録をしておいてください。 以下のコードの6行目の部分を取得したConsumer keyとConsumer secretをに置き換えてください。

適当なところからverifyアクションにリダイレクトしてくると、さらにTwitterにリダイレクトします。その後、callbackアクションに戻ってくるので、そこで認証して取得したトークンをUserモデルに保存します。(ここでは自分のサービスにログインしているユーザが認証を行っています。)

その後、保存したトークンを使ってTwitterに発言をします。リクエストが受け入れられなかった場合の処理などは省いてます。

Twitterには取得したトークンに有効期限はありませんが、有効期限が存在するものもある(どちらかというとそっちの方が多いのかも)気をつける必要があります。

ちなみに細かいことを調べていないので「トークンをDBに保存してしまっていいのか」とか「トークンが外部に漏れてしまった場合はどうしたらいいのか」などについてはよくわかっていません。

Home > Tags > Ruby

Feeds
Meta
Others

Return to page top