diff --git a/.gitignore b/.gitignore index cc2ff39..c27622e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ pom.xml.asc .lein-failures .lein-plugins .lein-repl-history +.nrepl-port diff --git a/project.clj b/project.clj index 1ad1d40..6e19a64 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject clj-jwt "0.0.7" +(defproject clj-jwt "0.0.8" :description "Clojure library for JSON Web Token(JWT)" :url "https://github.com/liquidz/clj-jwt" :license {:name "Eclipse Public License" diff --git a/src/clj_jwt/core.clj b/src/clj_jwt/core.clj index 64350f2..a0a6342 100644 --- a/src/clj_jwt/core.clj +++ b/src/clj_jwt/core.clj @@ -1,16 +1,16 @@ (ns clj-jwt.core (:require - [clj-jwt.base64 :refer [url-safe-encode-str url-safe-decode-str]] - [clj-jwt.sign :refer [get-signature-fn get-verify-fn supported-algorithm?]] - [clj-jwt.intdate :refer [joda-time->intdate]] - [clojure.data.json :as json] - [clojure.string :as str])) + [clj-jwt.base64 :refer [url-safe-encode-str url-safe-decode-str]] + [clj-jwt.sign :refer [get-signature-fn get-verify-fn supported-algorithm?]] + [clj-jwt.intdate :refer [joda-time->intdate]] + [clj-jwt.json-key-fn :refer [write-key read-key]] + [clojure.data.json :as json] + [clojure.string :as str])) (def ^:private DEFAULT_SIGNATURE_ALGORITHM :HS256) -(def ^:private full-key-name #(subs (str %) 1)) (def ^:private map->encoded-json (comp url-safe-encode-str - #(json/write-str % :key-fn full-key-name))) -(def ^:private encoded-json->map (comp #(json/read-str % :key-fn keyword) + #(json/write-str % :key-fn write-key))) +(def ^:private encoded-json->map (comp #(json/read-str % :key-fn read-key) url-safe-decode-str)) (defn- update-map [m k f] (if (contains? m k) (update-in m [k] f) m)) diff --git a/src/clj_jwt/json_key_fn.clj b/src/clj_jwt/json_key_fn.clj new file mode 100644 index 0000000..471dd7c --- /dev/null +++ b/src/clj_jwt/json_key_fn.clj @@ -0,0 +1,17 @@ +(ns clj-jwt.json-key-fn + (:require + [clojure.string :as str])) + +(defn write-key + [x] + (cond + (string? x) (str "\"" x "\"") + :else (name x))) + +(defn read-key + [x] + (if-let [y (re-seq #"^\"(.*)\"$" x)] + (-> y first second) + (keyword x))) + + diff --git a/test/clj_jwt/core_test.clj b/test/clj_jwt/core_test.clj index 477bb8b..55759d6 100644 --- a/test/clj_jwt/core_test.clj +++ b/test/clj_jwt/core_test.clj @@ -150,11 +150,11 @@ (-> claim jwt (sign :ES512 ec-prv-key) to-str str->jwt (verify ec-pub-key)) => true) (fact "Claims containing string key should be verified" - (let [sclaim {"a/b" "c"}] - (-> sclaim jwt (sign "foo") (verify "foo")) => true - (-> sclaim jwt (sign "foo") to-str str->jwt (verify "foo")) => true - (-> sclaim jwt (sign "foo") (verify "bar")) => false))) - + (let [sclaim {"a/b" "c"} + token (-> sclaim jwt (sign "foo"))] + (verify token "foo") => true + (-> token to-str str->jwt (verify "foo")) => true + (verify token "bar") => false))) (facts "str->jwt function should work." (let [before (jwt claim) @@ -168,6 +168,14 @@ before (-> claim jwt (sign "foo")) after (-> before to-str str->jwt)] (fact "signed jwt" + (:header before) => (:header after) + (:claims before) => (:claims after) + (:signature before) => (:signature after))) + + (let [claim {"a/b" "c"} + before (jwt claim) + after (-> before to-str str->jwt)] + (fact "Claim containing string key" (:header before) => (:header after) (:claims before) => (:claims after) (:signature before) => (:signature after)))) diff --git a/test/clj_jwt/json_key_fn_test.clj b/test/clj_jwt/json_key_fn_test.clj new file mode 100644 index 0000000..6c5832a --- /dev/null +++ b/test/clj_jwt/json_key_fn_test.clj @@ -0,0 +1,12 @@ +(ns clj-jwt.json-key-fn-test + (:require + [clj-jwt.json-key-fn :refer :all] + [midje.sweet :refer :all])) + +(fact "write-key should work fine." + (write-key :foo) => "foo" + (write-key "foo") => "\"foo\"") + +(fact "read-key should work fine." + (read-key "foo") => :foo + (read-key "\"foo\"") => "foo")