(ns frontend.handler.user "Provides user related handler fns like login and logout" (:require [frontend.config :as config] [frontend.handler.config :as config-handler] [frontend.state :as state] [frontend.debug :as debug] [clojure.string :as string] [cljs-time.core :as t] [cljs-time.coerce :as tc] [cljs-http.client :as http] [cljs.core.async :as async :refer [go go-loop jwt (string/split ".") second js/atob js/JSON.parse (js->clj :keywordize-keys true))) (defn- expired? [parsed-jwt] (some-> (* 1000 (:exp parsed-jwt)) tc/from-long (t/before? (t/now)))) (defn- almost-expired? "return true when jwt will expire after 1h" [parsed-jwt] (some-> (* 1000 (:exp parsed-jwt)) tc/from-long (t/before? (-> 1 t/hours t/from-now)))) (defn email [] (some-> (state/get-auth-id-token) parse-jwt :email)) (defn user-uuid [] (some-> (state/get-auth-id-token) parse-jwt :sub)) (defn logged-in? [] (boolean (some-> (state/get-auth-id-token) parse-jwt expired? not))) (defn- set-token-to-localstorage! ([id-token access-token] (prn :debug "set-token-to-localstorage!") (js/localStorage.setItem "id-token" id-token) (js/localStorage.setItem "access-token" access-token)) ([id-token access-token refresh-token] (prn :debug "set-token-to-localstorage!") (js/localStorage.setItem "id-token" id-token) (js/localStorage.setItem "access-token" access-token) (js/localStorage.setItem "refresh-token" refresh-token))) (defn- clear-tokens [] (state/set-auth-id-token nil) (state/set-auth-access-token nil) (state/set-auth-refresh-token nil) (set-token-to-localstorage! "" "" "")) (defn- set-tokens! ([id-token access-token] (state/set-auth-id-token id-token) (state/set-auth-access-token access-token) (set-token-to-localstorage! id-token access-token)) ([id-token access-token refresh-token] (state/set-auth-id-token id-token) (state/set-auth-access-token access-token) (state/set-auth-refresh-token refresh-token) (set-token-to-localstorage! id-token access-token refresh-token))) (defn id-token parse-jwt almost-expired?) (-> access-token parse-jwt almost-expired?)) (go ;; id-token or access-token expired ( resp :body (as-> $ (set-tokens! (:id_token $) (:access_token $) (:refresh_token $))) (#(state/pub-event! [:user/login]))) (debug/pprint "login-callback" resp))))) (defn logout [] (clear-tokens) (state/pub-event! [:user/logout])) ;;; refresh tokens loop (def stop-refresh false) (defn refresh-tokens-loop [] (debug/pprint "start refresh-tokens-loop") (go-loop [] ( id-token (parse-jwt) (almost-expired?))) (debug/pprint (str "refresh tokens... " (tc/to-string(t/now)))) (