在Node.js和Clojure之间共享用户会话

时间:2015-06-18 14:19:03

标签: node.js session cookies clojure

我正在使用Clojure / Friend,我想从邻近的node.js服务器劫持一个会话:)

我的意思是有node.js + Express 3服务器使用redis将会话存储到connect-redis数据库中。 我有权访问node.js源代码,因此传递给用于生成sid的快速会话的秘密。我修改了连接部分,看起来像这样(之前使用了内置的内存存储):

  var session    = require('express-session')
  , RedisStore   = require('connect-redis')(session)
  , redis        = require('redis')
  , client       = redis.createClient();

    ...

app.use(session({
    secret: "super-secret-key",
    store: new RedisStore({client : client,
                           ttl    : 60*60*24,
                           prefix : 'sess:'})
}));

我可以看到存储在Redis中的会话:

// using redis-cli KEYS * 1) "sess:yNV3MQOOTZSEgzl0RH2lyWVW"

登录页面位于应用程序的node.js端。但是API的路由在Node.js和Clojure之间共享(通过nginx),所以我在Compojure / Friend app中收到了传入请求中的cookie。

我正在努力让朋友自定义凭据功能正确:

(defn custom-credential [{:keys [username password] :as trial}]

  (let [cookie             (...)
        redis-session      (...)
        is-signature-valid (...)]
   ;; I can get all the above bindings just fine 
   ;; ie. I extract the cookie from the request
   ;; I read the cookie ID and fetch the cookie content from Redis
   ;; I extract the signature of the cookie and check it (I replicated [node-cookie-signature][8])

   (when is-signature-valid
      {:identity "cookie-id"})))


(defn secured-routes [unsecured-routes]
  (friend/authenticate
   unsecured-routes
   {:allow-anon? true
    :credential-fn custom-credential
    :workflows [(workflows/http-basic)]}))

我有几个问题:

  • 即使我的身份验证功能返回{:identity ..}地图

  • ,我也会被重定向到登录页面
  • 但我无法弄清楚如何将其插入Friend以便Cookie也能正常运行。使用默认的memory-store,然后将cookie替换为默认的ring-cookie(显然不是我想要的)。我尝试使用Redis作为后端编写自定义cookie存储,但我需要编写JSON以保持节点兼容性,并且我丢失了::user信息。

注意:此时我非常灵活,所以如果我应该使用FriendCompojure之外的其他内容,我也会接受。

很抱歉这篇长篇文章,我真的希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:1)

  

如何在验证功能上获取cookie内容?

响铃请求将包含客户端发送的任何cookie,但如果您的Clojure服务器位于不同的域,它可能不会发送这些cookie。

  

如何根据Cookie的内容验证用户? IE浏览器。如何确保cookie没有被更改(即复制connect-redis正在使用的秘密)?

最佳做法是将cookie作为随机数,并将会话详细信息存储在redis中。如果这就是Node服务器的工作方式,那么您只需在Redis中查找详细信息即可。或者,如果客户端提供了加密的会话cookie,那么您将需要以与Node相同的方式对其进行解密。

或者,您可能希望查看JWT auth令牌,这些令牌旨在由许多不同的服务器共享和验证。