2019年12月18日水曜日

Sinatra で JavaScript でセットした cookies を参照する方法

概要

Sinatra のエクステンション Sinatra::Contrib に含まれる Sinatra::Cookies を使います

環境

  • macOS 10.15.2
  • Ruby 2.6.2p47
  • Sinatra 2.0.7

sinatra-contrib インストール

  • vim Gemfile
gem "sinatra"
gem "sinatra-contrib"
  • bundle install --path vendor

Sinatra::Cookies をヘルパーとして使う

require 'sinatra/cookies' をし helpers として Sinatra::Cookies を追加すれば OK です
あとは cookies というハッシュが参照できます

  • vim app.rb
require 'sinatra/base'
require 'sinatra/cookies'

class App < Sinatra::Base
  helpers Sinatra::Cookies

  get '/' do
    if cookies.has_key?(:fb_access_token)
      puts cookies[:fb_access_token]
    end
    erb :index
  end
end

cookies をセットするクライアントサンプル

JavaScript 側は document.cookie = という感じで代入するだけで cookies に好きな値をセットできます
セットする値は文字列ですが「名前=値」で指定します

以下は Facebook ログインで成功したセッショントークンを cookies にセットするサンプルです
ちょっと長いですが cookies に値をセットしている箇所は document.cookie = 'fb_access_token=' + response.authResponse.accessToken; の部分だけです

  • vim views/index.erb
<html>
<head>
  <title></title>
</head>
<body>
  <script>
    window.fbAsyncInit = function() {
      FB.init({
        appId      : '2613442028942274',
        cookie     : true,
        xfbml      : true,
        version    : 'v5.0'
      });
      FB.AppEvents.logPageView();   
      FB.getLoginStatus(function(response) {
        console.log(response);
        if (response.status === 'connected') {
          console.log(response.authResponse.accessToken);
          document.cookie = 'fb_access_token=' + response.authResponse.accessToken;
        }
      });
    };
    (function(d, s, id){
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) {return;}
      js = d.createElement(s); js.id = id;
      js.src = "https://connect.facebook.net/en_US/sdk.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
    function checkLoginState() {
      FB.getLoginStatus(function(response) {
        console.log(response);
        if (response.status === 'connected') {
          console.log(response.authResponse.accessToken);
          document.cookie = 'fb_access_token=' + response.authResponse.accessToken;
        }
      });
    }
  </script>
  <fb:login-button 
    scope="public_profile,email"
    onlogin="checkLoginState();">
  </fb:login-button>
</body>
</html>

動作確認

  • bundle exec rackup config.ru -o 0.0.0.0

localhost:9292 にアクセスしましょう
ログインが成功して cookies に値がセットされた状態で再度ページにアクセスすると Sinatra 側でも cookies[:fb_access_token] が取得できているのが確認できると思います

最後に

Sinatra で JavaScript がセットした cookies を参照する方法を紹介しました
sinatra-contrib の Sinatra::Cookies を使えば OK です

JavaScript 側でも document.cookie という感じで簡単に cookies に値をセットすることができます
取得する場合は少し面倒なのでその場合は js-cookie/js-cookie を使うと簡単に扱えます

参考サイト

0 件のコメント:

コメントを投稿