Recentemente, em meu projeto Clojure, tivemos que nos integrar com o OAuth do Google para
autenticar nossos usuários. Foi um processo muito doloroso, então aqui está um
guia rápido para quem deseja fazer isso no futuro.
Para este guia irei usar stuarth/clj-oauth2 "0.3.2"
. Primeiro adicione isso como
uma dependência ao seu arquivo project.clj. Em seguida, vamos criar um
módulo de autenticação .
(ns authentication
(:require
[cheshire.core :refer [parse-string]
[clj-oauth2.client :as oauth2]))
(def login-uri
"https://accounts.google.com")
(def google-com-oauth2
{:authorization-uri (str login-uri "/o/oauth2/auth")
:access-token-uri (str login-uri "/o/oauth2/token")
:redirect-uri "http://localhost:8080/authentication/callback"
:client-id "CLIENT"
:client-secret "CLIENT-SECRET"
:access-query-param :access_token
:scope ["https://www.googleapis.com/auth/userinfo.email"]
:grant-type "authorization_code"
:access-type "online"
:approval_prompt ""})
(def auth-req
(oauth2/make-auth-request google-com-oauth2))
(defn- google-access-token [request]
(oauth2/get-access-token google-com-oauth2 (:params request) auth-req))
(defn- google-user-email [access-token]
(let [response (oauth2/get "https://www.googleapis.com/oauth2/v1/userinfo" {:oauth access-token})]
(get (parse-string (:body response)) "email")))
;; Redirect them to (:uri auth-req)
;; When they comeback to /authentication/callback
(google-user-email ;=> user's email trying to lgo in
(google-access-token *request*))
Então, o que fizemos aqui? Em primeiro lugar, exigimos a dependência OAuth2 em nosso namespace. Também incluímos cheshire, a biblioteca de análise JSON de Clojure. Em seguida, criamos um hash . Este hash contém todas as informações que o Googlen necessita quando solicitamos um token de acesso OAuth2. Substitua: client-id e: client-secret pelos valores que você obtém do Google ao configurar seu aplicativo Google. Certifique-se também de que seu: redirect-uri corresponde ao que você forneceu ao Google. google-com-oauth2
Usando esses dados, podemos construir um auth-req usando nossa biblioteca OAuth2. Quando os usuários vão para nosso aplicativo, quando tentam e fazem logon, o aplicativo deve redirecioná-los para .(:uri authentication/auth-req)
Quando o usuário retornar ao nosso aplicativo, ele estará em nosso callback uri.
Os parâmetros de solicitação desta solicitação devem ser semelhantes a
{:code "4/dasfjkhadsfkalsdasdfaskjf}
Usando este objeto de solicitação, podemos obter um token de acesso do Google. Finalmente, uma vez que temos um token de acesso, começamos a fazer oauth / get’s para recuperar informações do usuário do Google. Escrevi o método google-user-email, mas você pode obter outros valores do usuário se alterar o escopo de sua solicitação.