From f3b5b077960a75c6732788500db89be0e1ab7a89 Mon Sep 17 00:00:00 2001 From: Vitaly Kornilov Date: Wed, 6 Jan 2021 11:54:37 +0100 Subject: [PATCH] :tada: Add github auth provider. --- backend/src/app/config.clj | 5 +++++ backend/src/app/http.clj | 8 +++++--- backend/src/app/main.clj | 9 +++++++++ docs/05-Management-Guide.md | 2 ++ frontend/resources/locales.json | 9 +++++++++ frontend/resources/styles/main/layouts/login.scss | 11 +++++++++++ frontend/src/app/config.cljs | 1 + frontend/src/app/main/repo.cljs | 6 ++++++ frontend/src/app/main/ui/auth/login.cljs | 14 ++++++++++++++ 9 files changed, 62 insertions(+), 3 deletions(-) diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index 330a81b92..fee93ccd9 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -113,6 +113,9 @@ (s/def ::gitlab-client-secret ::us/string) (s/def ::gitlab-base-uri ::us/string) +(s/def ::github-client-id ::us/string) +(s/def ::github-client-secret ::us/string) + (s/def ::ldap-auth-host ::us/string) (s/def ::ldap-auth-port ::us/integer) (s/def ::ldap-bind-dn ::us/string) @@ -140,6 +143,8 @@ ::google-client-secret ::gitlab-client-id ::gitlab-client-secret + ::github-client-id + ::github-client-secret ::gitlab-base-uri ::asserts-enabled ::redis-uri diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 53c1113d3..09f6d03ca 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -90,7 +90,7 @@ (defn- create-router - [{:keys [session rpc google-auth gitlab-auth metrics ldap-auth storage svgparse] :as cfg}] + [{:keys [session rpc google-auth gitlab-auth github-auth metrics ldap-auth storage svgparse] :as cfg}] (rr/router [["/metrics" {:get (:handler metrics)}] @@ -115,7 +115,10 @@ ["/google/callback" {:get (:callback-handler google-auth)}] ["/gitlab" {:post (:auth-handler gitlab-auth)}] - ["/gitlab/callback" {:get (:callback-handler gitlab-auth)}]] + ["/gitlab/callback" {:get (:callback-handler gitlab-auth)}] + + ["/github" {:post (:auth-handler github-auth)}] + ["/github/callback" {:get (:callback-handler github-auth)}]] ["/login" {:post #(auth/login-handler cfg %)}] ["/logout" {:post #(auth/logout-handler cfg %)}] @@ -125,4 +128,3 @@ ["/rpc" {:middleware [(:middleware session)]} ["/query/:type" {:get (:query-handler rpc)}] ["/mutation/:type" {:post (:mutation-handler rpc)}]]]])) - diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index f0f2fc7a0..844df2d28 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -79,6 +79,7 @@ :metrics (ig/ref :app.metrics/metrics) :google-auth (ig/ref :app.http.auth/google) :gitlab-auth (ig/ref :app.http.auth/gitlab) + :github-auth (ig/ref :app.http.auth/github) :ldap-auth (ig/ref :app.http.auth/ldap) :svgparse (ig/ref :app.svgparse/handler) :storage (ig/ref :app.storage/storage)} @@ -108,6 +109,14 @@ :client-id (:google-client-id config) :client-secret (:google-client-secret config)} + :app.http.auth/github + {:rpc (ig/ref :app.rpc/rpc) + :session (ig/ref :app.http.session/session) + :tokens (ig/ref :app.tokens/tokens) + :public-uri (:public-uri config) + :client-id (:github-client-id config) + :client-secret (:github-client-secret config)} + :app.http.auth/gitlab {:rpc (ig/ref :app.rpc/rpc) :session (ig/ref :app.http.session/session) diff --git a/docs/05-Management-Guide.md b/docs/05-Management-Guide.md index f63800a97..ebeb3d44f 100644 --- a/docs/05-Management-Guide.md +++ b/docs/05-Management-Guide.md @@ -55,6 +55,8 @@ respective defaults): - `APP_GITLAB_CLIENT_SECRET=` (default undefined) - `APP_GITLAB_BASE_URI=` (default https://gitlab.com) +- `APP_GITHUB_CLIENT_ID=` (default undefined) +- `APP_GITHUB_CLIENT_SECRET=` (default undefined) ## REPL ## diff --git a/frontend/resources/locales.json b/frontend/resources/locales.json index 7bc30a867..1deab1ad9 100644 --- a/frontend/resources/locales.json +++ b/frontend/resources/locales.json @@ -134,6 +134,15 @@ "es" : "Entrar con Gitlab" } }, + "auth.login-with-github-submit" : { + "used-in" : [ "src/app/main/ui/auth/login.cljs:154" ], + "translations" : { + "en" : "Login with Github", + "fr" : "Se connecter via Github", + "ru" : "Вход через Gitnub", + "es" : "Entrar con Github" + } + }, "auth.login-with-ldap-submit" : { "used-in" : [ "src/app/main/ui/auth/login.cljs:105" ], "translations" : { diff --git a/frontend/resources/styles/main/layouts/login.scss b/frontend/resources/styles/main/layouts/login.scss index b1c4edda9..f24ea7342 100644 --- a/frontend/resources/styles/main/layouts/login.scss +++ b/frontend/resources/styles/main/layouts/login.scss @@ -79,4 +79,15 @@ margin-right: 1rem; } } + + .btn-github-auth { + margin-bottom: $medium; + text-decoration: none; + + .logo { + width: 20px; + height: 20px; + margin-right: 1rem; + } + } } diff --git a/frontend/src/app/config.cljs b/frontend/src/app/config.cljs index 8fa4f156c..3bd23d011 100644 --- a/frontend/src/app/config.cljs +++ b/frontend/src/app/config.cljs @@ -69,6 +69,7 @@ (def demo-warning (obj/get global "appDemoWarning" false)) (def google-client-id (obj/get global "appGoogleClientID" nil)) (def gitlab-client-id (obj/get global "appGitlabClientID" nil)) + (def github-client-id (obj/get global "appGithubClientID" nil)) (def login-with-ldap (obj/get global "appLoginWithLDAP" false)) (def worker-uri (obj/get global "appWorkerURI" "/js/worker.js")) (def public-uri (or (obj/get global "appPublicURI") diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index f0d0a8b72..498d22c15 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -91,6 +91,12 @@ (->> (http/send! {:method :post :uri uri}) (rx/mapcat handle-response)))) +(defmethod mutation :login-with-github + [id params] + (let [uri (str cfg/public-uri "/api/oauth/github")] + (->> (http/send! {:method :post :uri uri}) + (rx/mapcat handle-response)))) + (defmethod mutation :upload-file-media-object [id params] (let [form (js/FormData.)] diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index 4ddab03b7..21ec5c64d 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -46,6 +46,13 @@ (rx/subs (fn [{:keys [redirect-uri] :as rsp}] (.replace js/location redirect-uri))))) +(defn- login-with-github + [event] + (dom/prevent-default event) + (->> (rp/mutation! :login-with-github {}) + (rx/subs (fn [{:keys [redirect-uri] :as rsp}] + (.replace js/location redirect-uri))))) + (mf/defc login-form [] (let [error? (mf/use-state false) @@ -138,6 +145,13 @@ {:src "/images/icons/brand-gitlab.svg"}] (tr "auth.login-with-gitlab-submit")]) + (when cfg/github-client-id + [:a.btn-ocean.btn-large.btn-github-auth + {:on-click login-with-github} + [:img.logo + {:src "/images/icons/brand-github.svg"}] + (tr "auth.login-with-github-submit")]) + [:div.links.demo [:div.link-entry [:span (tr "auth.create-demo-profile") " "]