我正在使用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
信息。
注意:此时我非常灵活,所以如果我应该使用Friend
或Compojure
之外的其他内容,我也会接受。
很抱歉这篇长篇文章,我真的希望有人可以提供帮助。
答案 0 :(得分:1)
如何在验证功能上获取cookie内容?
响铃请求将包含客户端发送的任何cookie,但如果您的Clojure服务器位于不同的域,它可能不会发送这些cookie。
如何根据Cookie的内容验证用户? IE浏览器。如何确保cookie没有被更改(即复制connect-redis正在使用的秘密)?
最佳做法是将cookie作为随机数,并将会话详细信息存储在redis中。如果这就是Node服务器的工作方式,那么您只需在Redis中查找详细信息即可。或者,如果客户端提供了加密的会话cookie,那么您将需要以与Node相同的方式对其进行解密。
或者,您可能希望查看JWT auth令牌,这些令牌旨在由许多不同的服务器共享和验证。