diff --git a/README.md b/README.md index 6281c2a..021d287 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,13 @@ defp deps do end ``` +Define the JSON library to use in your config file and install it (Default: `Poison`): + +```elixir +config :json_web_token, + json_library: Jason +``` + ### JsonWebToken.sign(claims, options) Returns a JSON Web Token string diff --git a/config/config.exs b/config/config.exs index 6dfa82f..907a6df 100644 --- a/config/config.exs +++ b/config/config.exs @@ -22,3 +22,6 @@ use Mix.Config # here (which is why it is important to import them last). # # import_config "#{Mix.env}.exs" +if Mix.env() == :test do + import_config "test.exs" +end diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..9c84150 --- /dev/null +++ b/config/test.exs @@ -0,0 +1,4 @@ +use Mix.Config + +config :json_web_token, + json_library: Poison diff --git a/lib/json_web_token/jws.ex b/lib/json_web_token/jws.ex index 607b237..7df23d3 100644 --- a/lib/json_web_token/jws.ex +++ b/lib/json_web_token/jws.ex @@ -48,7 +48,7 @@ defmodule JsonWebToken.Jws do defp to_json_base64_encode(header) do header - |> Poison.encode + |> JsonWebToken.Util.json_library.encode |> header_json |> Base.url_encode64(padding: false) end @@ -87,7 +87,7 @@ defmodule JsonWebToken.Jws do [head | _] = String.split(jws, ".") head |> Base.url_decode64!(padding: false) - |> Poison.decode(keys: :atoms) + |> JsonWebToken.Util.json_library.decode(keys: :atoms) |> header_map end diff --git a/lib/json_web_token/jwt.ex b/lib/json_web_token/jwt.ex index 1721735..f77b675 100644 --- a/lib/json_web_token/jwt.ex +++ b/lib/json_web_token/jwt.ex @@ -64,7 +64,7 @@ defmodule JsonWebToken.Jwt do defp claims_to_json(""), do: raise "Claims blank" defp claims_to_json(claims) do claims - |> Poison.encode + |> JsonWebToken.Util.json_library.encode |> claims_json end @@ -100,7 +100,7 @@ defmodule JsonWebToken.Jwt do defp payload_to_map(encoded_payload) do encoded_payload |> Base.url_decode64!(padding: false) - |> Poison.decode(keys: :atoms) + |> JsonWebToken.Util.json_library.decode(keys: :atoms) |> claims_map end diff --git a/lib/json_web_token/util.ex b/lib/json_web_token/util.ex index f8e8bfd..6061e5f 100644 --- a/lib/json_web_token/util.ex +++ b/lib/json_web_token/util.ex @@ -35,4 +35,14 @@ defmodule JsonWebToken.Util do def validate_present(nil), do: raise "Param nil" def validate_present(""), do: raise "Param blank" def validate_present(param), do: param + + @doc """ + Gets the JSON library used by json_web_token. (By default `Poison`) + + + ## Example + iex> JsonWebToken.Util.json_library() + Poison + """ + def json_library(), do: Application.get_env(:json_web_token, :json_library) end diff --git a/mix.exs b/mix.exs index 71d4d1d..f593061 100644 --- a/mix.exs +++ b/mix.exs @@ -11,7 +11,10 @@ defmodule JsonWebToken.Mixfile do deps: deps(), package: package(), description: "Elixir implementation of the JSON Web Token (JWT), RFC 7519", - test_coverage: [tool: ExCoveralls] + test_coverage: [tool: ExCoveralls], + env: [ + json_library: Poison + ] ] end @@ -42,7 +45,7 @@ defmodule JsonWebToken.Mixfile do {:earmark, "~> 1.2", only: :dev}, {:ex_doc, "~> 0.16", only: :dev}, {:excoveralls, "~> 0.7", only: :test}, - {:poison, "~> 3.1"} + {:poison, "~> 3.1", only: :test} ] end diff --git a/mix.lock b/mix.lock index 2448dfa..86797e1 100644 --- a/mix.lock +++ b/mix.lock @@ -1,14 +1,16 @@ -%{"certifi": {:hex, :certifi, "1.2.1", "c3904f192bd5284e5b13f20db3ceac9626e14eeacfbb492e19583cf0e37b22be", [:rebar3], [], "hexpm"}, - "earmark": {:hex, :earmark, "1.2.2", "f718159d6b65068e8daeef709ccddae5f7fdc770707d82e7d126f584cd925b74", [:mix], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.16.1", "b4b8a23602b4ce0e9a5a960a81260d1f7b29635b9652c67e95b0c2f7ccee5e81", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm"}, - "excoveralls": {:hex, :excoveralls, "0.7.0", "05cb3332c2b0f799df3ab90eb7df1ae5a147c86776e91792848a12b7ed87242f", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, - "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm"}, - "hackney": {:hex, :hackney, "1.8.6", "21a725db3569b3fb11a6af17d5c5f654052ce9624219f1317e8639183de4a423", [:rebar3], [{:certifi, "1.2.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.0.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, - "idna": {:hex, :idna, "5.0.2", "ac203208ada855d95dc591a764b6e87259cb0e2a364218f215ad662daa8cd6b4", [:rebar3], [{:unicode_util_compat, "0.2.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, - "jsx": {:hex, :jsx, "2.8.2", "7acc7d785b5abe8a6e9adbde926a24e481f29956dd8b4df49e3e4e7bcc92a018", [:mix, :rebar3], [], "hexpm"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, - "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, - "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}, +%{ + "certifi": {:hex, :certifi, "1.2.1", "c3904f192bd5284e5b13f20db3ceac9626e14eeacfbb492e19583cf0e37b22be", [:rebar3], [], "hexpm", "54afd282e544833fbafbe2e845333132b5f092aee19dfae3a8fd970f67e0f2e6"}, + "earmark": {:hex, :earmark, "1.2.2", "f718159d6b65068e8daeef709ccddae5f7fdc770707d82e7d126f584cd925b74", [:mix], [], "hexpm", "59514c4a207f9f25c5252e09974367718554b6a0f41fe39f7dc232168f9cb309"}, + "ex_doc": {:hex, :ex_doc, "0.16.1", "b4b8a23602b4ce0e9a5a960a81260d1f7b29635b9652c67e95b0c2f7ccee5e81", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm", "1d4ecdc3f292883abf88b41c69da6a81fe928d6d0d65572a64b8d63a4d707693"}, + "excoveralls": {:hex, :excoveralls, "0.7.0", "05cb3332c2b0f799df3ab90eb7df1ae5a147c86776e91792848a12b7ed87242f", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "57d60e97debc32d4d7009b0410b46dc693d46c83078a1c0d7e5d2a5ff96d74da"}, + "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"}, + "hackney": {:hex, :hackney, "1.8.6", "21a725db3569b3fb11a6af17d5c5f654052ce9624219f1317e8639183de4a423", [:rebar3], [{:certifi, "1.2.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.0.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "677281a6eae416f4ca7980c8dfd1ee85c7cf445ed932c5d7f7909946d1cac37a"}, + "idna": {:hex, :idna, "5.0.2", "ac203208ada855d95dc591a764b6e87259cb0e2a364218f215ad662daa8cd6b4", [:rebar3], [{:unicode_util_compat, "0.2.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "352278f34e274a2e000b20e41aa74d6bc9a622407dc043b550a3cd3b7ac5457d"}, + "jsx": {:hex, :jsx, "2.8.2", "7acc7d785b5abe8a6e9adbde926a24e481f29956dd8b4df49e3e4e7bcc92a018", [:mix, :rebar3], [], "hexpm", "b4c5d3230b397c8d95579e4a3d72826bb6463160130ccf4182f5be8579b5f44c"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm", "7a4c8e1115a2732a67d7624e28cf6c9f30c66711a9e92928e745c255887ba465"}, + "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm", "4f8805eb5c8a939cf2359367cb651a3180b27dfb48444846be2613d79355d65e"}, "ssl_verify_hostname": {:hex, :ssl_verify_hostname, "1.0.5"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.2.0", "dbbccf6781821b1c0701845eaf966c9b6d83d7c3bfc65ca2b78b88b8678bfa35", [:rebar3], [], "hexpm"}} + "unicode_util_compat": {:hex, :unicode_util_compat, "0.2.0", "dbbccf6781821b1c0701845eaf966c9b6d83d7c3bfc65ca2b78b88b8678bfa35", [:rebar3], [], "hexpm", "1582b67d11eab7c57228449a422a401d2295f53edc21ce69edfd16d10d59d2ba"}, +}