ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

Grape × Devise、ちょっとRailsなときの認証のやり方

前回のあらすじ


なん…だと…?

誰得なニッチさですが(゚ε゚)キニシナイ!!!

前回の続きみたいな感じです。思ったよりもすぐに解決ができたので一応メモをば。


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というメソッドもあります。