sinatra + omniauth-twitterでForbiddenになる

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

インターネットを適当に検索して出てくるサンプルを動かしてみると、CVE-2015-9284対応前のバージョンのサンプルばかりで、/auth/twitterへアクセス時にForbiddenエラーが発生してしまう。

Gemのバージョン
gem "sinatra"           , "2.1.0"
gem "sinatra-contrib" , "2.1.0"
gem "omniauth" , "2.0.4"
gem "omniauth-oauth" , "1.2.0"
gem "omniauth-twitter" , "1.4.0"

マニュアルによると、

By default, this uses rack-protection’s AuthenticityToken class to validate authenticity tokens. If you are using a rack based framework like sinatra, you can find an example of how to add authenticity tokens to your view here.

https://github.com/omniauth/omniauth/wiki/Upgrading-to-2.0#racksinatra

デフォルトではAuthenticityToken クラスを使用して認証トークンを検証します。
sinatra のようなrackベースのフレームワークを使用している場合の、認証トークンをviewに追加するサンプルがここにあります。

と記載があり、
/auth/:providerのrequest parameterとしてauthenticity_tokenが必要とのこと。
値はrequest.env["rack.session"]["csrf"]を。

こんな感じのが必要.

<form method="post" action="/auth/twitter">
<input type="hidden" name="authenticity_token" value="<%=request.env['rack.session']['csrf']%>">
<button type="submit">login</button>
</form>

参考情報