【发布时间】:2018-03-16 20:40:46
【问题描述】:
在config.exs或dev.exs/prod.exs/test.exs中使用第三方模块时,似乎phoenix中配置文件的加载和编译方式存在问题。
示例:要设置 Guardian 进行 JWT 身份验证,我正在尝试使用 JOSE.JWK 模块在我的 config.exs 中创建/加载 JWK。我可以通过iex -S mix phoenix.server 在控制台中使用该模块。它当然是作为依赖安装的。我得到的错误是
** (Mix.Config.LoadError) could not load config config/config.exs
** (UndefinedFunctionError) undefined function JOSE.JWK.from_file/2 (module JOSE.JWK is not available)
这是我的 config.exs 中的代码
# 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
当我将对JOSE.JWK.from_file/2 的调用包装在匿名函数中时,它可以工作。但是当然 Guardian.config(:secret_key) 的值是匿名函数本身,而不是它的返回值:
# 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 接受了一个用于这个配置值的函数。但我可以想象这可能成为问题的其他情况。
这个限制是故意的吗?我错过了什么吗?有没有办法解决这个问题?
【问题讨论】:
-
我现在要解决的解决方法是:将
Code.load_file("config/support.exs")放在config/config.exs的顶部,然后将带有辅助函数的.exs 代码放在那里。我知道这不是一个令人满意的答案,但似乎没有。