Skip to content

Commit b718108

Browse files
committed
remove source ip validation
1 parent 6a0db58 commit b718108

File tree

3 files changed

+17
-57
lines changed

3 files changed

+17
-57
lines changed

authz/authz.go

Lines changed: 12 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
2424
"golang.org/x/net/http2"
2525
rpcstatus "google.golang.org/genproto/googleapis/rpc/status"
26-
"google.golang.org/protobuf/types/known/timestamppb"
2726

2827
pb "github.com/shelmangroup/envoy-oidc-authserver/internal/gen/session/v1"
2928
"github.com/shelmangroup/envoy-oidc-authserver/session"
@@ -139,16 +138,15 @@ func (s *Service) authProcess(ctx context.Context, req *auth.AttributeContext_Ht
139138
var headers []*core.HeaderValueOption
140139
var sessionData *pb.SessionData
141140
sessionCookieName := provider.CookieNamePrefix + "-" + ServiceName
142-
sourceIP := realIP(req.GetHeaders())
143141

144142
requestedURL := req.GetScheme() + "://" + req.GetHost() + req.GetPath()
145143
slog.Debug("client request url", slog.String("url", requestedURL))
146144

147145
// check if cookie exists and fetch session data from cookie
148-
sessionData, sessionId := s.getSessionCookieData(ctx, req, sourceIP, sessionCookieName)
146+
sessionData, sessionId := s.getSessionCookieData(ctx, req, sessionCookieName)
149147
if sessionData == nil || sessionId == "" {
150148
slog.Debug("session data not found in cookie, creating new")
151-
headers, err := s.newSession(ctx, sourceIP, requestedURL, sessionCookieName, provider)
149+
headers, err := s.newSession(ctx, requestedURL, sessionCookieName, provider)
152150
if err != nil {
153151
return nil, err
154152
}
@@ -173,7 +171,7 @@ func (s *Service) authProcess(ctx context.Context, req *auth.AttributeContext_Ht
173171
err := s.validateTokens(ctx, provider, sessionData, sessionCookieName, sessionId)
174172
if err != nil {
175173
slog.Warn("couldn't validating tokens", slog.String("err", err.Error()))
176-
headers, err := s.newSession(ctx, sourceIP, requestedURL, sessionCookieName, provider)
174+
headers, err := s.newSession(ctx, requestedURL, sessionCookieName, provider)
177175
if err != nil {
178176
return nil, err
179177
}
@@ -199,16 +197,12 @@ func (s *Service) retriveTokens(ctx context.Context, provider *OIDCProvider, ses
199197
sessionData.RefreshToken = tokens.RefreshToken
200198
sessionData.AccessToken = tokens.AccessToken
201199
sessionData.IdToken = tokens.IDToken
202-
sessionData.Expiry = timestamppb.New(tokens.Expiry)
203-
204-
// slog.Debug("successfully acquried tokens, now storing it to session cookie", slog.Any("sessionData", sessionData))
205200

206201
enc, err := session.EncodeToken(ctx, [32]byte(s.secretKey), sessionData)
207202
if err != nil {
208203
slog.Error("error encrypting session data", slog.String("err", err.Error()))
209204
return err
210205
}
211-
slog.Debug("Encrypted SessionData", slog.Int("byte_len", len(enc)))
212206

213207
// store session data in cache
214208
if err := s.store.Set(ctx, sessionId, enc); err != nil {
@@ -228,6 +222,7 @@ func (s *Service) validateTokens(ctx context.Context, provider *OIDCProvider, d
228222
return nil
229223
}
230224

225+
slog.Debug("Token expired, refreshing token...")
231226
if expired && d.RefreshToken == "" {
232227
return errors.New("token expired and no refresh token found, add scope=offline_access to the auth request to get a refresh token")
233228
}
@@ -239,9 +234,8 @@ func (s *Service) validateTokens(ctx context.Context, provider *OIDCProvider, d
239234
d.RefreshToken = t.RefreshToken
240235
d.AccessToken = t.AccessToken
241236
d.IdToken = t.IDToken
242-
d.Expiry = timestamppb.New(t.Expiry)
243237

244-
slog.Debug("Token refreshed, updating session cookie", slog.String("expire", t.Expiry.String()))
238+
slog.Debug("Token refreshed, updating session")
245239
enc, err := session.EncodeToken(ctx, [32]byte(s.secretKey), d)
246240
if err != nil {
247241
slog.Error("error encrypting session data", slog.String("err", err.Error()))
@@ -255,7 +249,7 @@ func (s *Service) validateTokens(ctx context.Context, provider *OIDCProvider, d
255249
return nil
256250
}
257251

258-
func (s *Service) newSession(ctx context.Context, sourceIP, requestedURL, sessionCookieName string, provider *OIDCProvider) ([]*core.HeaderValueOption, error) {
252+
func (s *Service) newSession(ctx context.Context, requestedURL, sessionCookieName string, provider *OIDCProvider) ([]*core.HeaderValueOption, error) {
259253
slog.Debug("Creating new session")
260254
var headers []*core.HeaderValueOption
261255

@@ -266,7 +260,6 @@ func (s *Service) newSession(ctx context.Context, sourceIP, requestedURL, sessio
266260
}
267261
slog.Debug("setting requested url", slog.String("requested_url", requestedURL))
268262
sessionData.RequestedUrl = requestedURL
269-
sessionData.SourceIp = sourceIP
270263

271264
enc, err := session.EncodeToken(ctx, [32]byte(s.secretKey), sessionData)
272265
if err != nil {
@@ -292,28 +285,26 @@ func (s *Service) newSession(ctx context.Context, sourceIP, requestedURL, sessio
292285
return append(headers, s.setCookie(cookie)...), nil
293286
}
294287

295-
func (s *Service) getSessionCookieData(ctx context.Context, req *auth.AttributeContext_HttpRequest, sourceIP, cookieName string) (*pb.SessionData, string) {
288+
func (s *Service) getSessionCookieData(ctx context.Context, req *auth.AttributeContext_HttpRequest, cookieName string) (*pb.SessionData, string) {
296289
var sessionData *pb.SessionData
297-
var cookie *http.Cookie
290+
var sessionId string
298291

299292
for _, c := range s.getCookies(req) {
300293
if c.Name == cookieName {
301294
if c.Valid() != nil {
302295
return nil, ""
303296
}
304297
slog.Debug("found a cookie 👌", slog.String("cookie_name", c.Name))
305-
cookie = c
298+
sessionId = c.Value
306299
}
307300
}
308301

309-
if cookie == nil {
310-
slog.Debug("no cookie found")
302+
if sessionId == "" {
303+
slog.Debug("no sessionId found in cookie")
311304
return nil, ""
312305
}
313306

314-
sessionId := cookie.Value
315-
slog.Debug("client source ip", slog.String("session_id", sessionId), slog.String("ip", sourceIP))
316-
307+
slog.Debug("getting session data from session store", slog.String("session_id", sessionId))
317308
d, err := s.store.Cache.Get(ctx, sessionId)
318309
if err != nil {
319310
slog.Error("error getting session data from cache", slog.String("err", err.Error()))
@@ -325,12 +316,6 @@ func (s *Service) getSessionCookieData(ctx context.Context, req *auth.AttributeC
325316
slog.Error("error decrypt session data", slog.String("err", err.Error()))
326317
return nil, ""
327318
}
328-
slog.Debug("getting session data from session cookie", slog.String("session_id", sessionId), slog.String("session_data_expiry", sessionData.Expiry.AsTime().String()))
329-
330-
if sessionData.SourceIp != sourceIP {
331-
slog.Warn("source ip missmatch, re-auth needed!", slog.String("session_id", sessionId), slog.String("session_ip", sessionData.SourceIp), slog.String("req_ip", sourceIP))
332-
return nil, ""
333-
}
334319

335320
return sessionData, sessionId
336321
}
@@ -428,27 +413,3 @@ func (s *Service) authResponse(success bool, httpStatusCode envoy_type.StatusCod
428413
},
429414
}
430415
}
431-
432-
func realIP(headers map[string]string) string {
433-
var ip string
434-
435-
var envoyExternalAddress = "x-envoy-external-address"
436-
var xForwardedFor = "x-forwarded-for"
437-
var xRealIP = "x-real-ip"
438-
439-
if tcip, ok := headers[envoyExternalAddress]; ok {
440-
ip = tcip
441-
} else if xrip, ok := headers[xRealIP]; ok {
442-
ip = xrip
443-
} else if xff, ok := headers[xForwardedFor]; ok {
444-
i := strings.Index(xff, ",")
445-
if i == -1 {
446-
i = len(xff)
447-
}
448-
ip = xff[:i]
449-
}
450-
if ip == "" || net.ParseIP(ip) == nil {
451-
return ""
452-
}
453-
return ip
454-
}

oidc/oidc.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,15 @@ func (o *OIDCProvider) IdpAuthURL(codeChallenge string) string {
7474

7575
func (o *OIDCProvider) VerifyTokens(ctx context.Context, accessToken, idToken string) (bool, error) {
7676
var expired bool
77-
_, err := rp.VerifyTokens[*oidc.IDTokenClaims](ctx, accessToken, idToken, o.provider.IDTokenVerifier())
77+
t, err := rp.VerifyTokens[*oidc.IDTokenClaims](ctx, accessToken, idToken, o.provider.IDTokenVerifier())
7878
if err != nil {
7979
if err == oidc.ErrExpired {
8080
expired = true
8181
} else {
8282
return false, err
8383
}
8484
}
85+
slog.Debug("tokens verified", slog.String("expire", t.GetExpiration().String()))
8586
return expired, nil
8687
}
8788

proto/session/v1/session.proto

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ message SessionData {
88
string requested_url = 1;
99
string code_verifier = 2;
1010
string code_challenge = 3;
11-
string source_ip = 4;
12-
string access_token = 5;
13-
string refresh_token = 6;
14-
string id_token = 7;
15-
google.protobuf.Timestamp expiry = 8;
11+
string access_token = 4;
12+
string refresh_token = 5;
13+
string id_token = 6;
1614
}

0 commit comments

Comments
 (0)