Grape × Devise、ちょっとRailsなときの認証のやり方
誰得なニッチさですが(゚ε゚)キニシナイ!!!
前回の続きみたいな感じです。思ったよりもすぐに解決ができたので一応メモをば。
GrapeもSinatraみたいにbeforeとかhelperとかあるんだろうなーと思ったらあった
デスマ覚悟したけど少ない変更ですんで助かりました
— ゆうなんとか@23~26東京 (@yuu_hara) 2013, 8月 13
Sinatraにはすべてのリクエストの前に必ず実行されるbeforeというブロックを引数にとるメソッドがあります*1。
require 'sinatra' before do halt 404, 'お探しの嫁は見つかりませんでした。' end get '/' do #ここに何を書いてもそれは返らない end
こんなかんじで使えますが、これでは一発ネタにしかなりませんね
で、これと全く同じ名前と機能を持つbeforeというメソッドがGrapeにもあるので、この中で判定すればよさそうです。
あとは、セッショントークンなりOAuthトークンなりを見て認証してやればOKです。以前OAuthプラグインをRailsに導入したお話をしたので、今回はOAuthでやるとどうなるか書いておきます。以前紹介したoauth-pluginをここのreadmeのようにRailsへ導入し、ついでにDeviseもセットアップ。昨日のようにGrapeをマウントした状態だと思ってください。もう二度と現れそうにないシチュエーションだけど(゚ε゚)キニシナイ!!
class API < Grape::API before do authorization = headers["Authorization"] @@token = unless authorization.nil? Oauth2Token.where(token: authorization.split.last, expires_at: [nil, ">= Time.now"]).first end @@token or error! {result: 0, reason: "なんかおかしい"}, 400 end #以下省略 end
beforeのブロックの中でセッションを見るようにしたりすれば応用できると思うんですが、いまいちですね…きっとマシな方法がもっと他にもあると思うんですが、今回はこれで行くことにしました。
*1:私は使ったことがありませんが、当然afterというメソッドもあります。