我正在使用Guardian来设置JWT身份验证。建议使用JWK(Json Web Key)来加密/签署JWT。要生成所述JWK,我使用JOSE.JWK。
由于我的密钥文件可能存储在源代码管理中,我希望它受密码保护。密码通过System.get_env
传递到elixir应用程序(访问环境变量)。
我可以生成该文件,并使用密码将其读回。但它在config/dev.exs
等配置文件中失败了。错误是
**(Mix.Config.LoadError)无法加载config config / dev.exs **(CompileError)config / dev.exs:2:模块JOSE.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: 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
答案 0 :(得分:1)
只有Guardian的主分支支持config.exs文件中的函数。已发布的版本(0.10.x)不支持函数。
此问题正在跟踪:https://github.com/ueberauth/guardian/issues/136。 你可以在这里看到新代码: https://github.com/ueberauth/guardian/blob/master/lib/guardian.ex#L292-296,尤其是第294行