Skip to content

Commit 66c81ca

Browse files
author
awb99
committed
oidc->local login improved
1 parent 0d52f0a commit 66c81ca

File tree

15 files changed

+90
-74
lines changed

15 files changed

+90
-74
lines changed

demo/deps.edn

+7-17
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,14 @@
88
org.pinkgorilla/oauth2 {:local/root "../" :deps/manifest :deps}
99
nrepl/nrepl {:mvn/version "1.2.0"}}
1010

11-
:aliases {:webly {:exec-fn webly.app.app/webly-build
12-
:exec-args {:config [{}]
13-
:profile "npm-install"}}
14-
15-
:npm-install {:exec-args {:profile "npm-install"}}
16-
:compile {:exec-args {:profile "compile"}}
17-
:release {:exec-args {:profile "release"}}
18-
:release-adv {:exec-args {:profile "release-adv"}}
19-
:static {:exec-args {:profile "static"}}
20-
:ci {:exec-args {:profile "ci"}}
21-
22-
:run {:exec-fn modular.system/start!
23-
:exec-args {:profile "jetty"
11+
:aliases {:npm-install {:exec-fn webly.app.app/webly-build
12+
:exec-args {:config [{}]
13+
:profile "npm-install"}}
14+
:demo {:exec-fn modular.system/start!
15+
:exec-args {:profile "watch"
2416
:config ["/home/florian/repo/myLinux/myvault/goldly/oauth2-localhost.edn" ; oauth2 secrets
25-
]
26-
:services "demo-services.edn"}}
27-
28-
}
17+
"demo-config.edn"]
18+
:services "demo-services.edn"}}}
2919

3020
;
3121
}

demo/resources/demo-config.edn

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{:timbre/clj {:min-level [[#{"org.apache.http.*"
2+
"org.eclipse.aether.*"
3+
"org.eclipse.jetty.*"
4+
"modular.oauth2.*"
5+
"modular.oauth2.token.refresh.*"
6+
"modular.ws.*"
7+
"webly.web.*"
8+
"goldly.ws-connect.*"
9+
"goldly.cljs.discover.*"
10+
"goldly.run.cljs-load.*"
11+
"goldly.run.cljs-load"
12+
"goldly.run.ws-connect"} :warn] ; webserver stuff - warn only
13+
; [#{"modular.ws.*"} :debug]
14+
[#{"modular.persist.*"} :warn]
15+
[#{"goldly.service.core"} :warn] ; goldly services - less logging
16+
[#{"*"} :info]] ; default -> info
17+
:appenders {:default {:type :console-color}}}}
18+

deps.edn

-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
{org.clojure/clojure {:mvn/version "1.11.1"}
55
funcool/promesa {:mvn/version "11.0.674"} ; needs to match version in ui-repl
66
tick/tick {:mvn/version "0.6.2"}
7-
8-
;nano-id/nano-id {:mvn/version "1.0.0"} ; nano id
97
;; web-ui deps
108
reagent/reagent {:mvn/version "1.1.1"} ; https://github.com/reagent-project/reagent
119
com.cemerick/url {:mvn/version "0.1.1"} ; url query-strings
File renamed without changes.
File renamed without changes.

src/token/identity/dialog.cljs

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
(let [r-p (local/get-token username password)]
1717
(-> r-p
1818
(p/then (fn [{:keys [user token] :as usermap}]
19-
(println "login local token success! user: " user " token: " token)
19+
(info "login local token success! user: " user " token: " token)
2020
(show-notification :info [:span.bg-blue-300.inline "logged in successfully"] 1000)
2121
(user/set-user! usermap)
2222
(dialog-close)))
2323
(p/catch (fn [err]
24-
(println "login local error: " err)
24+
(error "login local error: " err)
2525
(show-notification :error [:span.bg-red-300.inline "login error!"] 1000)
2626
(dialog-close))))))
2727

@@ -35,19 +35,19 @@
3535
:title (str "login via " provider)})]
3636
(-> r-p
3737
(p/then (fn [token]
38-
(println "login oauth2 token success! token: " token)
38+
(info "login oauth2 token success! token: " token)
3939
(show-notification :info [:span.bg-blue-300.inline "logged in successfully"] 1000)
4040
(let [user-p (oidc/login provider token)]
4141
(-> user-p
4242
(p/then (fn [usermap]
43-
(println "oauth2 login success: " usermap)
43+
(info "oauth2 login success: " usermap)
4444
(user/set-user! usermap)
4545
(dialog-close)))
4646
(p/catch (fn [login-err]
47-
(println "oauth2 login error: " login-err)
47+
(error "oauth2 login error: " login-err)
4848
(dialog-close)))))))
4949
(p/catch (fn [err]
50-
(println "login local error: " err)
50+
(error "login oidc error: " err)
5151
(show-notification :error [:span.bg-red-300.inline "login error!"] 1000)
5252
(dialog-close))))))
5353

src/token/identity/local.clj

+9-5
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@
3030
(codecs/bytes->hex)))
3131

3232
(defn create-claim [{:keys [secret] :as this} claim]
33+
(info "creating claim: " claim " secret: " secret)
3334
(let [token (jwt/sign claim secret)]
3435
(assoc claim :token token)))
3536

3637
(defn get-token [{:keys [permission] :as this} user-name user-password]
3738
(let [user-kw (keyword user-name)
3839
password-hashed (pwd-hash user-password)
3940
user (get-user permission user-kw)]
40-
(println "get-token user: " user-name " user-kw: " user-kw " user-details: " user)
41+
(info "get-token user: " user-name " user-kw: " user-kw " user-details: " user)
4142
(cond
4243
; user unknown
4344
(not user)
@@ -56,19 +57,22 @@
5657
:email (:email user)}))))
5758

5859
(defn verify-token [{:keys [secret] :as this} token]
59-
(println "verifying token: " token)
60+
(info "verifying token: " token " secret: " secret)
6061
(try
6162
(-> (jwt/unsign token secret)
6263
(update :user keyword))
63-
(catch Exception _
64+
(catch Exception ex
65+
(error "verify-token exception: " ex)
6466
{:error :bad-token
6567
:error-message "Bad Token"})))
6668

6769
(defn login
6870
[{:keys [permission secret] :as this} token]
6971
(info "login/local: token: " token " session: " *session*)
7072
(let [{:keys [user error] :as r} (verify-token this token)]
71-
(info "login/local: result: " r)
73+
(if error
74+
(taoensso.timbre/error "login/local error: " error " token: " token)
75+
(info "login/local: result: " r))
7276
(when user
7377
(set-user! permission *session* user))
7478
r))
@@ -97,7 +101,7 @@
97101
; (clj-jwt/unsign
98102
; "https://identity.xero.com/.well-known/openid-configuration/jwks"
99103
;"eyJhbGciOiJSUzI1NiIsImtpZCI6IjFDQUY4RTY2NzcyRDZEQzAyOEQ2NzI2RkQwMjYxNTgxNTcwRUZDMTkiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJISy1PWm5jdGJjQW8xbkp2MENZVmdWY09fQmsifQ.eyJuYmYiOjE2NDE1NjcwOTksImV4cCI6MTY0MTU2ODg5OSwiaXNzIjoiaHR0cHM6Ly9pZGVudGl0eS54ZXJvLmNvbSIsImF1ZCI6Imh0dHBzOi8vaWRlbnRpdHkueGVyby5jb20vcmVzb3VyY2VzIiwiY2xpZW50X2lkIjoiMUQ0RTUxQzMyNDA1NDUxQ0JCQTMyQzExMjkwOUE3QjgiLCJzdWIiOiJkODZhNTIyMThiODk1MDFiODE0ZmIyMDY1YjU5NzNlMSIsImF1dGhfdGltZSI6MTY0MTU2NjQ3OSwieGVyb191c2VyaWQiOiIzYzczNjBjMC02MTk1LTQ2MmQtYjkxMy03NmNlOWM2NmNiYjgiLCJnbG9iYWxfc2Vzc2lvbl9pZCI6IjZjYjZhZjRkNTQ4ZDQ3NDZhZTZjMTNjNWJjOThlOWFmIiwianRpIjoiZTM2Y2NkYzdlMjViOGVlMDFhM2U3YzBkNDAwZDk2OWIiLCJhdXRoZW50aWNhdGlvbl9ldmVudF9pZCI6IjA4ZTg2ZTdiLTZkMjctNDQxMS05MTFiLTY0YjJmMWQ1NzhjMCIsInNjb3BlIjpbImVtYWlsIiwicHJvZmlsZSIsIm9wZW5pZCIsImFjY291bnRpbmcucmVwb3J0cy5yZWFkIiwiYWNjb3VudGluZy5zZXR0aW5ncyIsImFjY291bnRpbmcuYXR0YWNobWVudHMiLCJhY2NvdW50aW5nLnRyYW5zYWN0aW9ucyIsImFjY291bnRpbmcuam91cm5hbHMucmVhZCIsImFjY291bnRpbmcudHJhbnNhY3Rpb25zLnJlYWQiLCJhY2NvdW50aW5nLmNvbnRhY3RzIiwib2ZmbGluZV9hY2Nlc3MiXX0.t9c33xsXXqAfxC8JOyTRPG8b-QrLzqkxIItenXyul3kaSulzue281jed1wFyIpBefDq_xNUfFt4SfrMMyplOxThjQMyYktweyftijfMfnHwa4ZlGJaArdNOFNNzm2XOhdlyjFsVpWrAsMdhb8U9LyZjtagePE90VWyF47N3733tsDj9IBMKOUTg0HVEzyHqR0b-yRXE7KraM9KB3A_-CmuKBjT9JfExfFD8K17vS5T94cHW36EAy1UwWS2NZcFai_nh838Yi4sT1x7HCC3rOJlH8-S-GdmgPXpY5enrJ3nvwhca9bSXQKrnxktubDZeKVV3M1Mfhp5Gr-44Jkzu5Ww")
100-
104+
101105
;
102106
)
103107

src/token/identity/local.cljs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
(ns token.identity.local
22
(:require
3+
[taoensso.timbre :refer-macros [info error]]
34
[promesa.core :as p]
45
[goldly.service.core :refer [clj]]))
56

67
(defn get-token
78
"returns a promise with the token or an error"
89
[user password]
9-
(println "local get-token user: " user "password: " password)
10+
(info "local get-token user: " user "password: " password)
1011
(let [r-p (p/deferred)
1112
data-p (clj 'token.identity.local/get-token user password)]
1213
(-> data-p
@@ -15,21 +16,21 @@
1516
(p/reject! r-p error-message)
1617
(p/resolve! r-p token))))
1718
(p/catch (fn [err]
18-
(println "get-token error: " err)
19+
(error "get-token error: " err)
1920
(p/reject! r-p err))))
2021
r-p))
2122

2223
(defn login
2324
"input: the result of get-token (or the saved token in localstorage)"
2425
[user]
25-
(println "login (local) user: " user)
26+
(info "login (local) user: " user)
2627
(let [r-p (p/deferred)
2728
data-p (clj 'token.identity.local/login user)]
2829
(-> data-p
2930
(p/then (fn [{:keys [error error-message] :as result}]
30-
(println "local login success: " result)
31+
(info "local login success: " result)
3132
(p/resolve! r-p result)))
3233
(p/catch (fn [err]
33-
(println "local login error: " err)
34+
(error "local login error: " err)
3435
(p/reject! r-p err))))
3536
r-p))

src/token/identity/oidc.clj

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@
2626

2727
(defn validate-token [jwt jwks alg]
2828
(try
29-
(warn "validate token: " jwt " jwks: " jwks " alg: " alg)
29+
;(warn "validate token: " jwt " jwks: " jwks " alg: " alg)
3030
(util/validate-jwt jwt jwks alg)
3131
(catch Exception ex
32-
(timbre/error "token validate exception: " ex)
32+
(timbre/error "oidc token validate exception: " ex)
3333
false)))
3434

3535
(defn login
3636
[{:keys [permission] :as this} {:keys [provider token]}]
3737
(info "login/oauth2-oidc: token: " token " session: " *session*)
3838
(let [;email (user-email token)
3939
jwks-url (provider/oauth2-jwks-uri {:provider provider})
40-
_ (info "getting jwks for provider: " provider " url: " jwks-url)
40+
;_ (info "getting jwks for provider: " provider " url: " jwks-url)
4141
jwks (util/get-jwks jwks-url)
4242
alg {:alg :rs256}
4343
jwt (util/token->id-jwt token)
44-
_ (info "jwt token (access token): " jwt)
44+
;_ (info "jwt token (access token): " jwt)
4545
{:keys [error email] :as validation-response} (validate-token jwt jwks alg)]
4646
(info "login/oauth2-oidc:validation-response: " validation-response)
4747
(if email

src/token/identity/oidc.cljs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
(ns token.identity.oidc
22
(:require
3+
[taoensso.timbre :refer-macros [info error]]
34
[promesa.core :as p]
45
[goldly.service.core :refer [clj]]))
56

67
(defn login
78
"input: the result of get-token (or the saved token in localstorage)"
89
[provider token]
9-
(println "login (oidc) provider:" provider " token: " token)
10+
(info "login (oidc) provider:" provider " token: " token)
1011
(let [r-p (p/deferred)
1112
data-p (clj 'token.identity.oidc/login {:provider provider :token token})]
1213
(-> data-p
1314
(p/then (fn [{:keys [error error-message] :as result}]
14-
(println "local oidc success: " result)
15+
(info "local oidc success: " result)
1516
(p/resolve! r-p result)))
1617
(p/catch (fn [err]
17-
(println "local oidc error: " err)
18+
(error "local oidc error: " err)
1819
(p/reject! r-p err))))
1920
r-p))

src/token/identity/oidc/util.clj

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@
6464
(let [decoded-jwt (decode-jwt jwt)
6565
pem (build-pem jwks decoded-jwt)
6666
public-key (keys/jwk->public-key pem)]
67-
(info "decoded jwt: " decoded-jwt)
68-
(info "pem: " pem)
69-
(info "public-key: " public-key)
67+
;(info "decoded jwt: " decoded-jwt)
68+
;(info "pem: " pem)
69+
;(info "public-key: " public-key)
7070
(when (keys/public-key? public-key)
7171
(jwt/unsign jwt public-key alg)))
7272
(catch Exception e

src/token/identity/service.clj

+5-7
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
[token.identity.oidc :refer [start-oidc-identity]]))
55

66
(defn start-identity-service [{:keys [permission clj secret]}]
7-
{:local (start-local-identity
8-
{:permission permission
9-
:clj clj
10-
:secret secret})
11-
:oidc (start-oidc-identity
12-
{:permission permission
13-
:clj clj})})
7+
(let [this {:permission permission
8+
:clj clj
9+
:secret secret}]
10+
{:local (start-local-identity this)
11+
:oidc (start-oidc-identity this)}))

src/token/identity/user.cljs

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
(ns token.identity.user
22
(:require
3-
[taoensso.timbre :refer-macros [info error]]
3+
[cljs.reader :refer [read-string]]
4+
[taoensso.timbre :refer-macros [info warn error]]
45
[reagent.core :as r]
5-
[token.identity.local :as local]
6-
[cljs.reader :refer [read-string]]))
6+
[token.identity.local :as local]))
77

88
;; LocalStorage Helpers
99

10-
(defn ls-set! [k v]
10+
(defn- ls-set! [k v]
1111
(.setItem js/localStorage (pr-str k) (pr-str v)))
1212

13-
(defn ls-get [k]
13+
(defn- ls-get [k]
1414
(when-let [s (.getItem js/localStorage (pr-str k))]
1515
(read-string s)))
1616

17-
(defn ls-remove! [k]
18-
(.removeItem js/localStorage k))
17+
(defn- ls-remove! [k]
18+
(.removeItem js/localStorage (pr-str k)))
1919

2020
(defonce user-key "oauth2-user")
2121

@@ -42,4 +42,7 @@
4242
(info "initializing user ..")
4343
(when-let [usermap (ls-get user-key)]
4444
(info "user loaded from localstorage: " usermap)
45-
(reset! user-a usermap)))
45+
(reset! user-a usermap)))
46+
47+
48+

src/token/oauth2/core.clj

+13-9
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,28 @@
1414
[token.oauth2.store :refer [load-token save-token]]
1515
[token.oauth2.token :refer [sanitize-token access-token-needs-refresh?]]))
1616

17-
(defn assert-provider [[id p]]
18-
(assert (keyword? id) "oauth2 provider key needs to be a keyword")
17+
(defn assert-provider [v]
18+
(let [[id p] v]
19+
(assert (keyword? id) (str "oauth2 provider key needs to be a keyword id: " id))
1920
(assert (map? p) "oauth2 provider needs to be a map")
2021
(assert (:client-id p) "oauth2 provider needs :client-id key")
2122
(assert (:client-secret p) "oauth2 provider needs :client-secret key")
22-
(assert (:token-prefix p) "oauth2 provider needs :token-prefix key")
2323
(assert (string? (:client-id p)) "oauth2 provider needs :client-id with type string")
24-
(assert (string? (:client-secret p)) "oauth2 provider needs :client-secret with type string")
25-
(assert (string? (:token-prefix p)) "oauth2 provider needs :token-prefix with type string"))
24+
(assert (string? (:client-secret p)) "oauth2 provider needs :client-secret with type string")))
2625

2726
(defn assert-providers [ps]
2827
(assert (map? ps) "oauth2 providers needs to be a map")
29-
;(doall (map assert-provider ps))
30-
)
28+
(doall (map assert-provider ps)))
3129

3230
(defn start-oauth2-providers [{:keys [clj _store providers] :as this}]
3331
(info "starting oauth2-provider service..")
34-
(assert-providers providers)
32+
(try
33+
(assert-providers providers)
34+
(catch AssertionError ex
35+
(info "assert error: " ex )
36+
(info "providers config: " providers)
37+
(throw (ex-info "oauth2 provider-config error!" {:ex ex}))))
38+
3539
(info "starting oauth2-provider service.. provider config ok.")
3640
(expose-functions clj
3741
{:name "token-oauth2"
@@ -40,7 +44,7 @@
4044
:permission nil
4145
:fixed-args [this]})
4246
(info "oauth2-provider service running..")
43-
this)
47+
nil)
4448

4549
(defn get-provider-client-id [{:keys [providers] :as this} p]
4650
(get-in providers [p :client-id]))

src/token/oauth2/service.clj

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
(defn start-oauth2-service [{:keys [clj providers store-path store-role]}]
77
(let [store (create-store {:clj clj
88
:store-path store-path
9-
:store-role store-role})
10-
providers (start-oauth2-providers
11-
{:clj clj
12-
:store store
13-
:providers providers})]
9+
:store-role store-role})]
10+
(start-oauth2-providers {:clj clj
11+
:store store
12+
:providers providers})
1413
{:store store
1514
:providers providers}))
1615

0 commit comments

Comments
 (0)