Socket.D v2.5.12

应用 - 鉴权

</> markdown

本协议要求通过 Url 进行连接,连接时还可带上 MetaString。这个,就像 Http 和 Websocket(有 url ,还有 header)。UrlQueryString 和 MetaString,会成为接收端的会话参数(Session::param)。在监听器的 onOpen 事件,可对 Session 进行校验。进而实现鉴权。

1、客户端

  • 基于 Url 签权
async def main():
    # 会成功
    clientSession1 = await SocketD.create_client("sd:ws://127.0.0.1:8602/?u=noear&p=2").open()
    await clientSession1.send("/demo", StringEntity("hi"))

    # 会失败
    clientSessio2 = await SocketD.creat_lient("sd:ws://127.0.0.1:8602/?u=solon&p=1").open();
    await clientSessio2.send("/demo2", StringEntity("hi"))
  • 也可以使用连接元信息(MetaString)
async def main():
    clientSession1 = await (SocketD.createClient("sd:ws://127.0.0.1:8602/")
                            .config(lambda c: c.meta_put("u", "noear").metaPut("p", "2"))
                            .open())

2、服务端

服务端可以在连接时通过 outMeta 输出 MetaString,让客户端的 Session::param 获取。

async def on_open(session:Session):
    user = session.param("u")
    if "noear".__eq__(user):
        # 还可以添加握手输出
        session.handshake().out_meta("server-ver", "1")
    else:
        await session.close()
async def on_message(session: Session, message: Message):
    log.info(str(message))


async def main():
    #::启动服务端
    await (SocketD.create_server("sd:ws")
           .config(lambda c: c.port(8602))
           .listen(EventListener().on_open(on_open).do_on_message(on_message))
           .start())