【问题标题】:Django websockets authDjango websockets 身份验证
【发布时间】:2019-01-02 09:49:31
【问题描述】:

我将 tornado + sockjs 用于 websockets 和 Django rest 框架用于主应用程序。 我还在 Django 应用程序上使用 rest-framework-jwt 进行身份验证。 现在我必须确定龙卷风中的用户。我怎么看:

  1. 当 sockjs 连接到 tornado 服务器时,用户在消息中发送 jwt。
  2. Tornado 服务器解析 jwt 并确定 jwt 是否有效?但是对于这个解决方案,我必须阅读数据库。但是这个操作是同步的,不好,因为tornado是异步的。

我还想用芹菜。当用户连接到龙卷风时,龙卷风会为 celery 创建任务,并在此任务中解析 jwt。在这种情况下,解决方案不是阻止龙卷风。但是如何通过 websockets 通知用户检查 jwt 呢?

【问题讨论】:

    标签: django tornado sockjs


    【解决方案1】:

    更新:

    您不需要读取数据库来验证 JWT。 JWT 是一个签名令牌,您只需要验证 JWT 的密钥即可。


    旧答案:

    (注意:下图对于 JWT 来说是相当多余的,因为 JWT 已经是一个签名的令牌,并且可以验证而无需保存在任何地方。但是,此图适用于基于 cookie授权)

    您可以使用消息代理(例如 Redis)在 Django 和 Tornado 之间共享身份验证令牌:

    Redis 快速且轻量级,您可以从 Tornado 异步连接它。

    这里不需要芹菜。

    【讨论】:

    • 我想到了 Redis。但是 Redis 不是异步的?
    • @Mike 您可以使用异步驱动程序连接 Redis。
    • 但是JWT token会过期,那怎么检查呢?
    【解决方案2】:

    如果您使用 SQLAlchemy 来连接和处理数据库,您可以使用 tornado-sqlalchemy 对数据库进行异步查询并通过 WebSocket 通知您的用户,而不会中断龙卷风的事件循环。

    @coroutine
    def open(self):
       with self.make_session() as session:
           jtw = request.params.get('authorization')
           jwt_valid = yield self.check_jwt_valid(jwt, session)
           if not jwt_valid:
              self.write('JWT Inválid')
              self.close()      
    
    @coroutine 
    def check_jwt_valid(self, jwt, session):
       jwt_found = session.query(JWT_QUERY...).first()
       return jwt_found
    

    【讨论】:

    • 也许可以,但我想使用来自 rest-framework-jwt 的方法。因为如果我想更改身份验证方法,所以我只需调用另一个方法而不是再次从数据库中读取。我认为对一项任务使用一种方法比使用多种方法(同步、异步等)更好的解决方案。
    猜你喜欢
    • 2011-02-11
    • 2021-12-11
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2011-09-23
    • 2013-09-09
    • 2017-02-24
    相关资源
    最近更新 更多