Elixir:如何使用JOSE.JWK.to_文件保存密钥文件以用于Guardian/JWT身份验证

Elixir:如何使用JOSE.JWK.to_文件保存密钥文件以用于Guardian/JWT身份验证,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在使用设置JWT身份验证。建议使用JWK(Json Web密钥)对JWT进行加密/签名。生成我使用的JWK 因为我的密钥文件可能存储在源代码管理中,所以我希望它有密码保护。密码通过系统传递到elixir应用程序。获取_env(访问环境变量) 我可以生成文件,也可以使用密码将其读回。但是它在我的配置文件中失败,比如config/dev.exs。错误是 **(Mix.Config.LoadError)无法加载Config/dev.exs **(CompileError)config/dev.ex

我正在使用设置JWT身份验证。建议使用JWK(Json Web密钥)对JWT进行加密/签名。生成我使用的JWK

因为我的密钥文件可能存储在源代码管理中,所以我希望它有密码保护。密码通过
系统传递到elixir应用程序。获取_env
(访问环境变量)

我可以生成文件,也可以使用密码将其读回。但是它在我的配置文件中失败,比如
config/dev.exs
。错误是

**(Mix.Config.LoadError)无法加载Config/dev.exs **(CompileError)config/dev.exs:2:module JOSE.JWK未加载且找不到

我的dev.exs:

use Mix.Config

# Configure Guardian for JWT Authentication
config :guardian, Guardian,
  allowed_algos: ["HS512"], # optional
  verify_module: Guardian.JWT,  # optional
  issuer: "MyApp",
  ttl: { 30, :days },
  verify_issuer: true, # optional
  secret_key:  System.get_env("GUARDIAN_KEY_PASSPHRASE") |> JOSE.JWK.from_file(System.get_env("GUARDIAN_KEY_FILE")),
  serializer: MyApp.GuardianSerializer
在控制台中,一切正常。所以我猜当解析配置文件时,模块还没有加载。有办法解决这个问题吗

编辑: 它似乎与何时加载模块以及如何以及何时评估和编译配置文件有关。例如,在匿名函数中包装对
JSON.JWK
的调用可以:

use Mix.Config

# Configure Guardian for JWT Authentication
config :guardian, Guardian,
  allowed_algos: ["HS512"], # optional
  verify_module: Guardian.JWT,  # optional
  issuer: "MyApp",
  ttl: { 30, :days },
  verify_issuer: true, # optional
  secret_key: fn -> System.get_env("GUARDIAN_KEY_PASSPHRASE") |> JOSE.JWK.from_file(System.get_env("GUARDIAN_KEY_FILE")) end,
  serializer: MyApp.GuardianSerializer

只有Guardian的主分支支持config.exs文件中的函数。发布的版本(0.10.x)不支持功能

正在此处跟踪此问题:。 您可以在此处看到新代码:
,尤其是第294行,这可能是显而易见的,但我需要问一下。您是否已在
mix.exs
中将
{:jose,“~>1.7”},{:poison,“~>2.1”}
添加到deps并运行
mix deps.get
?@tkowal
jose
当然在依赖项中,它也在控制台中工作。我认为这与如何以及何时加载和编译配置以及何时加载模块有关。我相应地更新了我的问题“在控制台中工作”你是说它在iex中工作?这很奇怪,因为iex使用相同的配置。我还要问一个更明显的问题:P您是否运行了
mix-compile
?我相信
iex-S mix-run
可以按需编译路径中的模块,而
mix-run
不能。我的意思是
iex
,对不起,旧的Rails习惯。。。问题是:如果我不将调用封装在匿名函数中,它将无法编译,这就是问题所在。它失败,错误是
JOSE.JWK
不可用。是否可以与我们共享该应用程序?或者至少举个例子?我想用它来检查引擎盖下发生了什么。谢谢。事实上,我自己也提出了这个问题:)