【发布时间】:2017-05-22 21:41:12
【问题描述】:
这可能是基于意见的,但我仍然想知道是否有最佳做法,因为我对 websocket 做法几乎一无所知
我有一个 SPA,它从我自己的 OP 获取 JWT 令牌。然后它使用该 JWT 连接到我使用 REST 和 WebSockets 拥有的其他服务。
就 REST 而言,它非常简单:
- REST API 验证 JWT(以
Authorization: Bearer ...发送)并提供对受保护资源的访问权限或以401响应,让 SPA 知道它需要请求新令牌。
现在有了 websocket:
在加载 SPA 期间,一旦我得到一个令牌,我就会向我的 web 服务打开一个 WS。我发送的第一条消息是带有我的 JWT 的 login_message,然后我将其保存在服务器的 websocket 实例上以了解谁在发送消息。
我收到的每条后续消息都会验证 JWT 以查看它是否已过期。
据我了解,一旦过期,我将面临两种选择:
删除带有某种
token_expired错误的 websocket,并在令牌刷新后强制浏览器建立新的 websocket 连接。保持 websocket 打开,返回错误消息并发送新的登录消息(一旦刷新令牌)
不要使用登录消息,而只是在每个请求中发送 JWT。
问题:您会推荐哪种方法,为什么?在安全性和性能方面。还有其他我没有列出的常见做法吗?
【问题讨论】:
-
#1 `OP` 是什么意思? #2 经典方法是将用户/密码交换为新的 jwt。那么,我发送的第一条消息是我的 JWT 的 login_message 是什么意思
-
OP与 OpenID 提供程序一样。我们当时正在尝试使用 JWT 对 WebSocket 应用身份验证,而不会打扰用户输入他的凭据,方法是在服务器端实现它或删除 websocket 并使用刷新的 JWT 重新授权。我将在一两天内详细分享我们提出的实践,因为我看到了对这个问题的如此兴趣。虽然使用 REST 一切都很容易,但 WS 保持套接字打开,因此需要解决令牌过期而套接字仍然打开的情况。 -
基本流程是什么? #1 用户进入 acme.com,输入其凭据,生成一个 jwt 令牌以能够使用您的任何 api,如果令牌过期,使用 websockets 生成一个新令牌?或者 #2 acme.com 没有登录表单,用户进入 acme.com,使用某种逻辑,该用户使用 websockets 获取 jwt 令牌,如果 jwt 过期,则使用 websockets 生成一个新令牌。 .......... 如果您的主要目标是拥有一个您的用户必须能够使用您的任何 api 的网络,我可以向您分享一个干净且标准的方法,您可以在其中使用 websockets(如果应用)在某些流程部分。
-
如上所述,用户通过使用标准 OAuth2.0 流程输入他的凭据来获取他的 JWT。使用该 JWT,他可以毫无问题地访问我的 REST API。然而,我的一项服务通过 WebSocket 提供实时数据,套接字也需要授权用户,就像使用 REST 一样,但是虽然 REST 是无状态的,但 WebSocket 保持打开状态,并且可能会达到短暂 JWT 的时间点过期。问题是关于这种特定的到期情况 - 如何更好地处理,通过关闭套接字或保持打开状态等待客户端使用应用程序代码更新
-
您的用户能否重新登录以更新令牌?
标签: websocket jwt openid-connect