概要
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 件のコメント:
コメントを投稿