我正在构建一个使用Passport.js和OAuth策略进行身份验证的angular2-login-seed。显然,使用这些工具进行身份验证的默认方法是使用由express签名的HTTP cookie。根据我的说法,Passport管理实际的Set Cookie
标题,以便express可以通过request.isAuthenticated()
对每个后续请求进行身份验证,并通过req.session.passport.dataHere
访问护照数据集。
我想通过websockets将实时数据合并到应用程序中。这当然意味着从服务器到客户端的套接字流。此通信完全独立于常规HTTP服务器请求,意思是:
它不包含所有HTTP请求包含的HTTP cookie
Express不会代理与套接字的交互,它使用后端中使用的任何实现进行管理(sock.js,socket.io)
这使得很难简化用于表达的HTTP请求之间的身份验证,以及将websocket数据简化为后端,因为它们是单独的通信方法。
从我的研究中,这给我留下了两个选择。其中一个是使用library来实现我的套接字实现(最好是socket.io上的socket.js,但我需要做更多研究)访问快速会话。然后我可以根据需要验证套接字连接。问题是我不知道如何将快速cookie从前面获取到流中,因为javascript无法访问它(仅HTTP cookie)。
我看到人们跳过的另一个常见解决方案是使用JWT(JSON Web令牌)。围绕此实现的实现将JWT存储在前端的localstorage中。这就是SPA(在我的案例中是Angular2服务)可以在每次请求“无状态”的情况下发送它。服务器身份验证我们可以通过websocket发送它来验证websocket连接(前端JS显然可以访问localstorage)。在考虑这种实现时会想到几件事:
是否可以让Passport OAuth策略使用JWT而不是常规会话信息?这会带来什么样的改变?据我所知,Passport策略使用某种形式的OAuth1或OAuth2父策略进行身份验证,默认使用cookie。
将此重要信息存储在localstorage中会导致应用程序出现安全漏洞(XSS,CSRF等)
如果是这样,我见过的最常见的解决方法是将JWT存储在cookie中,这样就无法轻易访问,欺骗或伪造。然而,这让我回到了使用JWT之前的位置,所以不妨不去理会。 p>
这是否意味着我必须在后端使用某种状态管理存储(例如Redis)来管理JWT主体的身份验证和解码? (我对Redis等一无所知)。
在服务器HTTP请求和套接字数据之间连接身份验证的想法很奇怪,但对正确验证套接字连接似乎至关重要。我有点惊讶,不存在更简单的方法。我已经完成了一些研究并看过socketio-jwt,express-jwt等内容,但我不知道这是否可以通过我的Passport策略进行管理,或者将套接字实现中的快速会话数据打开会更容易,或者如果我认为这一切都错了!
非常感谢任何帮助或指导。
答案 0 :(得分:0)
然后我可以根据需要验证套接字连接。问题是我不知道如何将快速cookie从前面获取到流中,因为javascript无法访问它(仅HTTP cookie)。
使用express-socket.io-session会话auth在握手时完成,握手是一个http请求,所以即使你的cookie是http-only它也可以。 (由我自己测试)