How about something like this? Unsure about concurrent access to global
variables, but if you want to access srv and clientstore from package sw,
It'd make sense to me to move srv and clientstore out of main and into a
package.
howToApplyMiddleware
main.go
- server
server.go
- sw
handler.go
router.go
middleware.go
//main.go
package main
import (
"log"
"net/http"
"howToApplyMiddleware/sw"
)
func main() {
log.Printf("Server started")
log.Fatal(http.ListenAndServe(":8000", sw.Router))
}
//server.go
package server
import (
"gopkg.in/oauth2.v3/errors"
"gopkg.in/oauth2.v3/manage"
"gopkg.in/oauth2.v3/server"
"gopkg.in/oauth2.v3/store"
"log"
)
var ClientStore *store.ClientStore
var SRV *server.Server
func init() {
ClientStore = store.NewClientStore()
manager := manage.NewDefaultManager()
manager.SetAuthorizeCodeTokenCfg(manage.DefaultAuthorizeCodeTokenCfg)
manager.MapClientStorage(ClientStore)
manager.SetRefreshTokenCfg(manage.DefaultRefreshTokenCfg)
manager.MustTokenStorage(store.NewMemoryTokenStore())
SRV = server.NewDefaultServer(manager)
SRV.SetAllowGetAccessRequest(true)
SRV.SetClientInfoHandler(server.ClientFormHandler)
SRV.SetInternalErrorHandler(func(err error) (re *errors.Response) {
log.Println("Internal Error:", err.Error())
return
})
SRV.SetResponseErrorHandler(func(re *errors.Response) {
log.Println("Response Error:", re.Error.Error())
})
}
//handler.go
package sw
import (
"net/http"
)
//Funtion in handler.go in subdir
func protecteduri(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, I'm protected"))
}
//middleware.go
package sw
import (
"net/http"
"howToApplyMiddleware/server"
)
//This function in middleware.go in subdir
func validateToken(f func(http.ResponseWriter, *http.Request))
func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
_, err := server.SRV.ValidationBearerToken(r)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
f(w, r)
}
}
//router.go
package sw
import (
"encoding/json"
"fmt"
"github.com/google/uuid"
"github.com/gorilla/mux"
"gopkg.in/oauth2.v3/models"
"net/http"
"howToApplyMiddleware/server"
"strings"
)
var Router *mux.Router
func init() {
Router = NewRouter()
Router.HandleFunc("/oauth2/token", func(w http.ResponseWriter, r
*http.Request) {
server.SRV.HandleTokenRequest(w, r)
})
Router.HandleFunc("/credentials", func(w http.ResponseWriter, r
*http.Request) {
clientId := uuid.New().String()[:8]
clientSecret := uuid.New().String()[:8]
err := server.ClientStore.Set(clientId, &models.Client{
ID: clientId,
Secret: clientSecret,
Domain: "http://localhost:9094",
})
if err != nil {
fmt.Println(err.Error())
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"CLIENT_ID": clientId,
"CLIENT_SECRET": clientSecret})
})
}
type Route struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
type Routes []Route
func NewRouter() *mux.Router {
router := mux.NewRouter().StrictSlash(true)
for _, route := range routes {
var handler http.Handler
handler = route.HandlerFunc
//handler = Logger(handler, route.Name)
router.
Methods(route.Method).
Path(route.Pattern).
Name(route.Name).
Handler(handler)
}
return router
}
func Index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
var routes = Routes{
{
"Index",
"GET",
"/",
Index,
},
{
"protecteduri",
strings.ToUpper("Get"),
"/protected",
validateToken(protecteduri),
},
}
On Thursday, April 4, 2019 at 4:44:14 AM UTC-4, [email protected] wrote:
>
> I have modify the middleware to the below but it only work if the handler
> function "/protected" is in the main function.
> I have many handlers and do not want to put all of them in the main.go.
> You suggest i define a struct and use member function of the struct, can
> you elaborate more about for me or the format.
>
> func ValidateToken(srv *server.Server) func(http.Handler) http.Handler {
> return func(next http.Handler) http.Handler {
> return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
> notAuth := []string{"/oauth2/token", "/credentials"} //List of endpoints
> that doesn't require auth
> requestPath := r.URL.Path //current request path
>
> //check if request does not need authentication, serve the request if it
> doesn't need it
> for _, value := range notAuth {
>
> if value == requestPath {
> next.ServeHTTP(w, r)
> return
> }
> }
> _, err := srv.ValidationBearerToken(r)
> if err != nil {
> http.Error(w, err.Error(), http.StatusBadRequest)
> return
> }
>
> next.ServeHTTP(w, r)
> })
> }
> }
>
>
> On Thursday, April 4, 2019 at 10:46:08 AM UTC+3, [email protected]
> wrote:
>>
>> changing and using "router.Use(getTokenMW(server))" is validating all the
>> routes. How can i exclude routes
>> /oauth2/token and /credentials. I read that populate but i dont get the
>> idea.
>> Any clew about how to go about this?
>>
>> On Wednesday, April 3, 2019 at 6:47:12 PM UTC+3, Burak Serdar wrote:
>>>
>>> On Wed, Apr 3, 2019 at 8:35 AM <[email protected]> wrote:
>>>
>>> > type Route struct {
>>> > Name string
>>> > Method string
>>> > Pattern string
>>> > HandlerFunc http.HandlerFunc
>>> > }
>>> >
>>> > type Routes []Route
>>> >
>>> > func NewRouter() *mux.Router {
>>> > router := mux.NewRouter().StrictSlash(true)
>>> > for _, route := range routes {
>>> > var handler http.Handler
>>> > handler = route.HandlerFunc
>>> > handler = Logger(handler, route.Name)
>>> >
>>> > router.
>>> > Methods(route.Method).
>>> > Path(route.Pattern).
>>> > Name(route.Name).
>>> > Handler(handler)
>>> > }
>>> >
>>> > return router
>>> > }
>>> >
>>> > func Index(w http.ResponseWriter, r *http.Request) {
>>> > fmt.Fprintf(w, "Hello World!")
>>> > }
>>> >
>>> > var routes = Routes{
>>> > {
>>> > "Index",
>>> > "GET",
>>> > "/",
>>> > Index,
>>> > },
>>> >
>>> > {
>>> > "protecteduri",
>>> > strings.ToUpper("Get"),
>>> > "/protected",
>>> > protecteduri,
>>> > },
>>> > }
>>> >
>>> > My question is how do i apply the "validateToken" function
>>> (middleware) to the routes in the router.go?
>>> > The function is to validate the access token in the request message
>>> before calling the handler functions.
>>> >
>>> Have you looked at the gorilla/mux documentation about middlewares?
>>> There are examples there: https://godoc.org/github.com/gorilla/mux
>>>
>>> You need to change the validateToken func:
>>>
>>> func getTokenMW(srv *server.Server) func(http.Handler) http.Handler {
>>> return func(next http.Handler) http.Handler {
>>> return http.HandlerFunc(func(w http.ResponseWriter, r
>>> *http.Request) {
>>> }
>>> }
>>> }
>>>
>>> Then:
>>> router.Use(getTokenMW(server))
>>>
>>> Or, you can define a struct, put the server pointer in it, and use a
>>> member function of that struct as the middleware.
>>>
>>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.