使用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
相关产品推荐
相关产品推荐

