python 后端中近协议的 JWT 身份验证

use*_*713 5 nearprotocol

在以太坊中,JWT 身份验证通过以下过程进行:
https ://github.com/Bearle/django-web3-auth/

1) 用户使用帐户私钥在元掩码中签署消息。
2) 账户地址和签名消息 POST 到后端
3) 后端验证签名是否正确,并生成签名的 Json Web Token (JWT),证明持有者控制该地址

Near协议使用以下代码进行签名:

window.near = await nearlib.connect(Object.assign({ deps: { keyStore: new nearlib.keyStores.BrowserLocalStorageKeyStore() } }, window.nearConfig));

// Needed to access wallet login
window.walletAccount = new nearlib.WalletAccount(window.near);
Run Code Online (Sandbox Code Playgroud)

和这个:

await this.props.wallet.requestSignIn(
      window.nearConfig.contractName,
      appTitle
    )
Run Code Online (Sandbox Code Playgroud)

如何在后端使用近登录,特别是验证步骤。在 python 中,如果是 web3,它使用

from web3auth.utils import recover_to_addr

if not address == recover_to_addr(token, signature):
            return None
Run Code Online (Sandbox Code Playgroud)

我可以在近协议中使用 python(或 javascript 或 rust)中的某些内容吗?Rust 的例子很好,因为我可以通过 cffi 调用 python 中的函数。
请提供一些代码。

Vla*_*lov 7

NEAR Wallet 不提供 JWT 身份验证,但总体过程如下:

  1. 用户使用密钥签署消息(例如,通过钱包或终端的近 shell 登录后);near-api-js在 Signer 接口上有signMessage方法,但您可以使用任何 ed25519 实现来使用密钥对二进制 blob 进行签名
  2. 帐户 ID 和签名消息被 POST 到后端
  3. 后端使用任何 ed25519 库来验证签名是否正确(同样,near-api-jsKeyPair 有verify方法),并查询 NEAR RPC API以确认密钥属于帐户 ID。

  • 这是我在javascript中的做法:https://gist.github.com/sandoche/e5cdfd5af1e50e892e5a536b7c3d74bf (2认同)