最近、私はRailsとErlangアプリケーションの間でセッションデータを共有したいという同様の問題がありました。私の解決策は、セッションをRedisに保存したクラスRack::Session::Abstract::ID
をハッシュvaulesとして書くことでした。 String
タイプのMarshal.dump
は呼び出しません。これにより、非ルビアプリケーションがsession_id
のセッション値の一部を使用できるようになります。あなたが呼び出したい場合は
redis.hgetall("rack.session:#{session_id}")
:で
use MaybeMarshalRedisSession
、他の場所から:とラックから
MyApp::Application.config.session_store MaybeMarshalRedisSession
:あなたがしてレールからこれを使用することができます
require 'rack/session/abstract/id'
class MaybeMarshalRedisSession < Rack::Session::Abstract::ID
def initialize(app, options = {})
@redis = options.delete(:redis) || Redis.current
@expiry = options[:expire_after] ||= (60 * 60 * 24)
@prefix = options[:key] || 'rack.session'
@session_key = "#{@prefix}:%s"
super
end
def get_session(env, sid)
sid ||= generate_sid
session = @redis.hgetall(@session_key % sid)
session.each_pair do |key, value|
session[key] = begin
Marshal.load(value)
rescue TypeError
value
end
end
[sid, session]
end
def set_session(env, sid, session, options={})
@redis.multi do
session.each_pair do |key, value|
# keep string values bare so other languages can read them
value = value.is_a?(String) ? value : Marshal.dump(value)
@redis.hset(@session_key % sid, key, value)
end
@redis.expire(@session_key % sid, @expiry)
end
sid
end
def destroy_session(env, sid, option={})
@redis.del(@session_key % sid)
generate_sid unless options[:drop]
end
end
あなたのMainAppまたはNode.jsのPhotoAppあなたのユーザーのセッションCookieを含むHTTPリクエストを作成できます。
このようなシナリオの実装に役立つ[Oauth Servers](http://www.knight.io/categories/oauth-servers-ruby)がいくつかあります。 –