You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用asyncua 1.0.4通过用户名密码连接OPC UA服务器失败求助

解决asyncua连接OPC UA服务器身份令牌无效问题

你的问题出在设置用户名密码的时机错误:进入async with Client块后,客户端已经完成了初始连接和会话激活,此时再调用set_user和set_password不会覆盖已有的身份信息,导致服务器收到的是匿名令牌(或无效令牌),从而报错BadIdentityTokenInvalid。

以下是两种正确的实现方式:

方式一:创建Client时直接传入身份信息

这是最简洁的写法,在初始化客户端时就指定用户名密码,连接阶段会自动完成身份验证:

async with Client(url=self._url, timeout=2, username="guest", password="guest") as client:
    # 验证通过,可直接操作OPC UA节点
    example_node = client.get_node("ns=1;i=1000")
    node_value = await example_node.read_value()

方式二:连接前动态设置身份信息

如果需要动态生成用户名密码,可以在进入async with块前完成设置:

client = Client(url=self._url, timeout=2)
await client.set_user("guest")
await client.set_password("guest")
async with client:
    # 后续节点操作逻辑

可选:手动构造身份令牌调用activate_session

如果需要更精细控制身份验证流程,可以手动构造UsernamePasswordIdentityToken并激活会话:

from asyncua.ua import UsernamePasswordIdentityToken

async with Client(url=self._url, timeout=2) as client:
    identity_token = UsernamePasswordIdentityToken(username="guest", password="guest")
    await client.activate_session(identity_token)
    # 验证通过后的操作

你之前注释的client.activate_session(username="guest", password="guest")写法错误,该方法的参数是身份令牌对象,而非直接传入用户名密码字符串,这也是它无法生效的原因。

UaExpert能正常连接是因为它在连接初始化阶段就正确传递了身份令牌,和上述正确写法的逻辑一致。

内容的提问来源于stack exchange,提问作者MarcinO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:04:55