我正在构建一个angular2-login-seed,使用Passport.js和OAuth策略进行身份验证。显然,这些工具的默认身份验证方法是使用由express签名的HTTP cookie。据我所知,Passport管理实际的
我希望通过Websockets在应用程序中合并实时数据。当然,这意味着从服务器到客户端的套接字流。此通信与常规HTTP服务器请求完全分开,这意味着:
Set Cookie
标头,以便express可以通过request.isAuthenticated()
验证每个后续请求,并通过req.session.passport.dataHere
访问由passport设置的数据。我希望通过Websockets在应用程序中合并实时数据。当然,这意味着从服务器到客户端的套接字流。此通信与常规HTTP服务器请求完全分开,这意味着:
它不包含所有HTTP请求都包含的HTTP cookie
Express不会代理与套接字的交互,而是由后端使用的任何实现来管理(sock.js、socket.io)
根据我的研究,我有两个选项。其中之一是使用库来使我的套接字实现(最好使用sock.js而不是socket.io,但我需要做更多的研究)能够访问express会话。然后我可以按照自己的方式对套接字连接进行身份验证。问题是我不知道如何从前端将express cookie放入流中,因为javascript无法访问它(HTTP only cookie)。
另一个常见的解决方案是使用JWT(JSON Web Tokens)。围绕此实现的实现将JWT存储在前端的localstorage中。这样SPA(在我的情况下是Angular2服务)可以通过每个请求发送它以进行“无状态”服务器身份验证,并且我们还可以通过websocket发送它以验证websocket连接(前端JS显然可以访问localstorage)。考虑此实现时会想到一些事情:
是否有可能使用JWT代替常规会话信息来使用Passport OAuth策略?这需要做出什么修改?据我所知,Passport策略使用某种OAuth1或OAuth2父策略进行身份验证,默认使用cookie。
将此重要信息存储在localstorage中是否会使应用程序容易受到安全漏洞(XSS、CSRF等)的攻击?
如果是这样,我见过最常见的解决方法是将JWT存储在cookie中,以便更难以访问、欺骗或伪造。然而,这让我回到了使用JWT之前的位置,所以没必要费事。
这是否意味着我必须在后端使用某种状态管理存储(例如Redis)来管理JWT主体的身份验证和解码?(我对Redis等一无所知)。