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

时间:2016-04-18 21:15:20

标签: elixir phoenix-framework

我正在使用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

1 个答案:

答案 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行