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

使用Joken创建Ed25519签名JWT遇函数匹配错误求助

问题:使用Joken创建Ed25519签名JWT时出现FunctionClauseError

我尝试用Joken库创建Ed25519签名的JWT,代码如下:

privKey = """
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIPaIrqi+I+znfdsteEXELr2J1e+qC72KNam6fx40pYvi
-----END PRIVATE KEY-----
"""

signer = Joken.Signer.create("Ed25519", %{"pem" => privKey})

Joken.generate_and_sign!(%{}, %{"name" => "John Doe"}, signer)

运行后抛出以下错误:

** (FunctionClauseError) no function clause matching in :jose_jwk_kty_ec.parameters_to_crv/1    

    The following arguments were given to :jose_jwk_kty_ec.parameters_to_crv/1:
    
        # 1
        :ed25519
    
    (jose 1.11.2) src/jwk/jose_jwk_kty_ec.erl:410: :jose_jwk_kty_ec.parameters_to_crv/1
    (jose 1.11.2) src/jwk/jose_jwk_kty_ec.erl:389: :jose_jwk_kty_ec.jws_alg_to_digest_type/2
    (jose 1.11.2) src/jwk/jose_jwk_kty_ec.erl:199: :jose_jwk_kty_ec.sign/3
    (jose 1.11.2) src/jws/jose_jws.erl:311: :jose_jws.sign/4
    (jose 1.11.2) src/jwt/jose_jwt.erl:173: :jose_jwt.sign/3
    (joken 2.5.0) lib/joken/signer.ex:128: Joken.Signer.sign/2
    (joken 2.5.0) lib/joken.ex:361: Joken.encode_and_sign/3
    iex:6: (file)

错误原因

这个错误的核心是签名算法标识使用错误:

  • 你传入的"Ed25519"会被Joken/Jose库误识别为EC(椭圆曲线)算法类型,但Ed25519在JOSE标准中属于单独的OKP(Octet Key Pair)密钥类型,不属于EC范畴。
  • 底层的:jose_jwk_kty_ec模块仅处理传统EC曲线(如P-256、P-384等),无法识别:ed25519参数,因此触发了函数子句不匹配的错误。

解决方法

将签名算法改为JOSE标准规定的"EdDSA"(Ed25519是EdDSA的具体实现),修改后的代码如下:

privKey = """
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIPaIrqi+I+znfdsteEXELr2J1e+qC72KNam6fx40pYvi
-----END PRIVATE KEY-----
"""

# 使用标准JOSE算法标识"EdDSA"
signer = Joken.Signer.create("EdDSA", %{"pem" => privKey})

Joken.generate_and_sign!(%{}, %{"name" => "John Doe"}, signer)

你的Ed25519私钥PEM格式是正确的,无需修改,仅调整算法名称即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:01:14