diff --git a/.gitignore b/.gitignore index 4196746..3d744cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -auth.db \ No newline at end of file +auth.db +goauth20 \ No newline at end of file diff --git a/go.mod b/go.mod index 072f3d3..c12bc1e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,9 @@ module github.com/ldrogou/goauth20 go 1.15 require ( + github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/gorilla/mux v1.8.0 github.com/jmoiron/sqlx v1.2.0 github.com/mattn/go-sqlite3 v1.14.6 + github.com/mitchellh/mapstructure v1.4.1 ) diff --git a/go.sum b/go.sum index 6532dee..7e182b0 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,6 @@ +github.com/dgrijalva/jwt-go v1.0.2 h1:KPldsxuKGsS2FPWsNeg9ZO18aCrGKujPoWXn2yo+KQM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -7,3 +10,5 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= diff --git a/goauth20 b/goauth20 index ccdefe2..af4be35 100755 Binary files a/goauth20 and b/goauth20 differ diff --git a/routes.auth.go b/routes.auth.go index 129f478..f1e2c22 100644 --- a/routes.auth.go +++ b/routes.auth.go @@ -9,6 +9,9 @@ import ( "net/http" "net/url" "strconv" + "time" + + "github.com/dgrijalva/jwt-go" ) //File structure du fichier @@ -32,6 +35,16 @@ type token struct { refreshToken string `json:"refresh_token"` } +// Create a struct that will be encoded to a JWT. +// We add jwt.StandardClaims as an embedded type, to provide fields like expiry time +type Claims struct { + Sub string `json:"sub"` + IDEntreprise string `json:"idEntreprise"` + RcaPartnerID string `json:"rcaPartnerId"` + Roles []string `json:"roles"` + jwt.StandardClaims +} + func (s *server) handleIndex() http.HandlerFunc { return func(rw http.ResponseWriter, r *http.Request) { rw.Header().Set("Content-Type", "text/html") @@ -51,14 +64,65 @@ func (s *server) handleIndex() http.HandlerFunc { } } +func (s *server) handleTest() http.HandlerFunc { + return func(rw http.ResponseWriter, r *http.Request) { + fmt.Println("sub") + + sub := r.FormValue("sub") + fmt.Printf("sub %v", sub) + idEntreprise := r.FormValue("id_entreprise") + fmt.Printf("idEntreprise %v", idEntreprise) + rcaPartnerID := r.FormValue("rcaPartnerId") + fmt.Printf("rcaPartnerID %v", rcaPartnerID) + var jwtKey = []byte(r.FormValue("secret")) + fmt.Printf("secret %v", jwtKey) + + // Declare the expiration time of the token + // here, we have kept it as 5 minutes + expirationTime := time.Now().Add(5 * time.Hour) + roles := []string{"RCA_CLOUD_EXPERT_COMPTABLE", + "E_COLLECTE_BO_CREA", + "E_CREATION_CREA", + "E_QUESTIONNAIRE_CREA"} + // Create the JWT claims, which includes the username and expiry time + claims := &Claims{ + Sub: sub, + IDEntreprise: idEntreprise, + RcaPartnerID: rcaPartnerID, + Roles: roles, + StandardClaims: jwt.StandardClaims{ + // In JWT, the expiry time is expressed as unix milliseconds + ExpiresAt: expirationTime.Unix(), + }, + } + fmt.Printf("claims %v", claims) + + // Declare the token with the algorithm used for signing, and the claims + tokenstr := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + fmt.Printf("token %v", tokenstr) + + // Create the JWT string + tokenString, err := tokenstr.SignedString(jwtKey) + fmt.Printf("tokenString %v", tokenString) + if err != nil { + log.Printf("erreur %v", err) + // If there is an error in creating the JWT return an internal server error + rw.WriteHeader(http.StatusInternalServerError) + return + } + + s.response(rw, r, tokenString, http.StatusOK) + } + +} func (s *server) handleRedirect() http.HandlerFunc { return func(rw http.ResponseWriter, r *http.Request) { codes, _ := r.URL.Query()["code"] jsonStr := constJsonToken(codes[0]) - apiURL := "https://api.XXX.XXX.XXX/auth/v1/oauth2.0/accessToken" + apiURL := "https://api.captation.beta.rca.fr/auth/v1/oauth2.0/accessToken" data := url.Values{} data.Set("client_id", jsonStr.clientID) data.Set("client_secret", jsonStr.clientSecret) @@ -90,7 +154,7 @@ func (s *server) handleRedirect() http.HandlerFunc { } defer resp.Body.Close() - fmt.Println(t.(interface{}).(map[string]interface{})["access_token"]) + tokenVal := t.(interface{}).(map[string]interface{}) if err != nil { log.Printf("Cannot parse token body err=%v", err) @@ -98,7 +162,7 @@ func (s *server) handleRedirect() http.HandlerFunc { return } - s.response(rw, r, t, http.StatusOK) + s.response(rw, r, tokenVal["access_token"], http.StatusOK) } } diff --git a/routes.go b/routes.go index e6127e5..2431952 100644 --- a/routes.go +++ b/routes.go @@ -3,4 +3,6 @@ package main func (s *server) routes() { s.router.HandleFunc("/index", s.handleIndex()).Methods("GET") s.router.HandleFunc("/oauth/redirect", s.handleRedirect()).Methods("GET") + s.router.HandleFunc("/test", s.handleTest()).Methods("POST") + } diff --git a/template/jwt.html b/template/jwt.html index cf6584b..524d3a3 100644 --- a/template/jwt.html +++ b/template/jwt.html @@ -29,7 +29,11 @@ } function generateToken() { - window.location = 'https://XXX.XXX.XXX/entreprise-partenaire/authorize?client_id=meg-test-interne&scope=user.read company.read accounting_firm.read sales¤t_company=true&redirect_uri=http://localhost:8080/oauth/redirect' + var form = document.getElementById("monform"); + + form.submit(); + + //window.location = 'https://captation.beta.rca.fr/entreprise-partenaire/authorize?client_id=meg-test-interne&scope=user.read company.read accounting_firm.read sales¤t_company=true&redirect_uri=http://localhost:8080/oauth/redirect' } function generate() { @@ -73,7 +77,7 @@
-
+
account_circle @@ -118,7 +122,6 @@
-