Skip to content

Commit e122359

Browse files
author
Anders Qvist
committed
Switch to new oidcecho package.
1 parent e2b7eb5 commit e122359

File tree

5 files changed

+67
-35
lines changed

5 files changed

+67
-35
lines changed

examples/api/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ func getHandler[T any](cfg shared.RuntimeConfig, claimsValidationFn options.Clai
143143

144144
return shared.RunGin[T](oidcHandler, cfg.Address, cfg.Port)
145145
case shared.EchoJwtServer:
146-
parseToken := oidcechojwt.New(claimsValidationFn, opts...)
146+
oidcMiddleware := oidcechojwt.New(claimsValidationFn, opts...)
147147

148-
return shared.RunEchoJWT[T](parseToken, cfg.Address, cfg.Port)
148+
return shared.RunEcho[T](oidcMiddleware, cfg.Address, cfg.Port)
149149
case shared.FiberServer:
150150
oidcHandler := oidcfiber.New(claimsValidationFn, opts...)
151151

examples/shared/server_echo.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package shared
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"net/http"
7+
8+
"github.com/labstack/echo/v4"
9+
"github.com/labstack/echo/v4/middleware"
10+
)
11+
12+
func newEchoClaimsHandler[T any](c echo.Context) error {
13+
claims, ok := c.Get("user").(T)
14+
if !ok {
15+
return echo.NewHTTPError(http.StatusUnauthorized, "invalid token")
16+
}
17+
18+
return c.JSON(http.StatusOK, claims)
19+
}
20+
21+
func RunEcho[T any](oidcMiddleware echo.MiddlewareFunc, address string, port int) error {
22+
e := echo.New()
23+
e.HideBanner = true
24+
25+
e.Use(middleware.Logger())
26+
e.Use(middleware.Recover())
27+
e.Use(middleware.Secure())
28+
e.Use(oidcMiddleware)
29+
30+
handler := newEchoClaimsHandler[T]
31+
32+
e.GET("/", handler)
33+
34+
addr := net.JoinHostPort(address, fmt.Sprintf("%d", port))
35+
return e.Start(addr)
36+
}

examples/shared/server_echo_jwt.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"github.com/labstack/echo/v4/middleware"
1010
)
1111

12-
type echoJWTParseTokenFunc func(auth string, c echo.Context) (interface{}, error)
13-
1412
func newEchoJWTClaimsHandler[T any](c echo.Context) error {
1513
claims, ok := c.Get("user").(T)
1614
if !ok {
@@ -20,17 +18,14 @@ func newEchoJWTClaimsHandler[T any](c echo.Context) error {
2018
return c.JSON(http.StatusOK, claims)
2119
}
2220

23-
func RunEchoJWT[T any](parseToken echoJWTParseTokenFunc, address string, port int) error {
21+
func RunEchoJWT[T any](echoMiddleware echo.MiddlewareFunc, address string, port int) error {
2422
e := echo.New()
2523
e.HideBanner = true
2624

2725
e.Use(middleware.Logger())
2826
e.Use(middleware.Recover())
2927
e.Use(middleware.Secure())
30-
31-
e.Use(middleware.JWTWithConfig(middleware.JWTConfig{
32-
ParseTokenFunc: parseToken,
33-
}))
28+
e.Use(echoMiddleware)
3429

3530
handler := newEchoJWTClaimsHandler[T]
3631

oidcechojwt/echo_jwt.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,41 @@ import (
1010

1111
// New returns an OpenID Connect (OIDC) discovery `ParseTokenFunc`
1212
// to be used with the the echo `JWT` middleware.
13-
func New[T any](claimsValidationFn options.ClaimsValidationFn[T], setters ...options.Option) func(auth string, c echo.Context) (interface{}, error) {
13+
func New[T any](claimsValidationFn options.ClaimsValidationFn[T], setters ...options.Option) echo.MiddlewareFunc {
1414
h, err := oidc.NewHandler(claimsValidationFn, setters...)
1515
if err != nil {
1616
panic(fmt.Sprintf("oidc discovery: %v", err))
1717
}
1818

19-
return toEchoJWTParseTokenFunc(h.ParseToken, setters...)
19+
return toEchoHandler(h.ParseToken, setters...)
2020
}
2121

22-
type echoJWTParseTokenFunc func(auth string, c echo.Context) (interface{}, error)
23-
2422
func onError(errorHandler options.ErrorHandler, description options.ErrorDescription, err error) {
2523
if errorHandler != nil {
2624
errorHandler(description, err)
2725
}
2826
}
2927

30-
func toEchoJWTParseTokenFunc[T any](parseToken oidc.ParseTokenFunc[T], setters ...options.Option) echoJWTParseTokenFunc {
28+
func toEchoHandler[T any](parseToken oidc.ParseTokenFunc[T], setters ...options.Option) echo.MiddlewareFunc {
3129
opts := options.New(setters...)
3230

33-
echoJWTParseTokenFunc := func(auth string, c echo.Context) (interface{}, error) {
34-
ctx := c.Request().Context()
35-
36-
claims, err := parseToken(ctx, auth)
37-
if err != nil {
38-
onError(opts.ErrorHandler, options.ParseTokenErrorDescription, err)
39-
return nil, err
31+
return func(next echo.HandlerFunc) echo.HandlerFunc {
32+
return func(c echo.Context) error {
33+
ctx := c.Request().Context()
34+
35+
tokenString, err := oidc.GetTokenString(c.Request().Header.Get, opts.TokenString)
36+
if err != nil {
37+
onError(opts.ErrorHandler, options.GetTokenErrorDescription, err)
38+
return echo.ErrBadRequest
39+
}
40+
41+
claims, err := parseToken(ctx, tokenString)
42+
if err != nil {
43+
onError(opts.ErrorHandler, options.ParseTokenErrorDescription, err)
44+
return echo.ErrUnauthorized
45+
}
46+
c.Set(string(opts.ClaimsContextKeyName), claims)
47+
return next(c)
4048
}
41-
42-
return claims, nil
4349
}
44-
45-
return echoJWTParseTokenFunc
4650
}

oidcechojwt/echo_jwt_test.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/xenitab/go-oidc-middleware/options"
1414

1515
"github.com/labstack/echo/v4"
16-
"github.com/labstack/echo/v4/middleware"
1716
"github.com/phayes/freeport"
1817
"github.com/stretchr/testify/require"
1918
)
@@ -28,19 +27,17 @@ func BenchmarkSuite(b *testing.B) {
2827
oidctesting.RunBenchmarks(b, testName, newTestHandler(b))
2928
}
3029

31-
func testGetEchoRouter(tb testing.TB, parseToken echoJWTParseTokenFunc) *echo.Echo {
30+
func testGetEchoRouter(tb testing.TB, echoMiddleware echo.MiddlewareFunc) *echo.Echo {
3231
tb.Helper()
3332

3433
e := echo.New()
3534
e.HidePort = true
3635
e.HideBanner = true
3736

38-
e.Use(middleware.JWTWithConfig(middleware.JWTConfig{
39-
ParseTokenFunc: parseToken,
40-
}))
37+
e.Use(echoMiddleware)
4138

4239
e.GET("/", func(c echo.Context) error {
43-
claims, ok := c.Get("user").(oidctesting.TestClaims)
40+
claims, ok := c.Get("claims").(oidctesting.TestClaims)
4441
if !ok {
4542
return echo.NewHTTPError(http.StatusUnauthorized, "invalid token")
4643
}
@@ -115,13 +112,13 @@ func (h *testHandler) NewHandlerFn(claimsValidationFn options.ClaimsValidationFn
115112
func (h *testHandler) ToHandlerFn(parseToken oidc.ParseTokenFunc[oidctesting.TestClaims], opts ...options.Option) http.Handler {
116113
h.tb.Helper()
117114

118-
echoParseToken := toEchoJWTParseTokenFunc(parseToken, opts...)
119-
return testGetEchoRouter(h.tb, echoParseToken)
115+
echoMiddleware := toEchoHandler(parseToken, opts...)
116+
return testGetEchoRouter(h.tb, echoMiddleware)
120117
}
121118

122119
func (h *testHandler) NewTestServer(opts ...options.Option) oidctesting.ServerTester {
123120
h.tb.Helper()
124121

125-
echoParseToken := New[oidctesting.TestClaims](nil, opts...)
126-
return newTestServer(h.tb, testGetEchoRouter(h.tb, echoParseToken))
122+
echoMiddleware := New[oidctesting.TestClaims](nil, opts...)
123+
return newTestServer(h.tb, testGetEchoRouter(h.tb, echoMiddleware))
127124
}

0 commit comments

Comments
 (0)