@@ -23,7 +23,6 @@ import (
23
23
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
24
24
"golang.org/x/net/http2"
25
25
rpcstatus "google.golang.org/genproto/googleapis/rpc/status"
26
- "google.golang.org/protobuf/types/known/timestamppb"
27
26
28
27
pb "github.com/shelmangroup/envoy-oidc-authserver/internal/gen/session/v1"
29
28
"github.com/shelmangroup/envoy-oidc-authserver/session"
@@ -139,16 +138,15 @@ func (s *Service) authProcess(ctx context.Context, req *auth.AttributeContext_Ht
139
138
var headers []* core.HeaderValueOption
140
139
var sessionData * pb.SessionData
141
140
sessionCookieName := provider .CookieNamePrefix + "-" + ServiceName
142
- sourceIP := realIP (req .GetHeaders ())
143
141
144
142
requestedURL := req .GetScheme () + "://" + req .GetHost () + req .GetPath ()
145
143
slog .Debug ("client request url" , slog .String ("url" , requestedURL ))
146
144
147
145
// 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 )
149
147
if sessionData == nil || sessionId == "" {
150
148
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 )
152
150
if err != nil {
153
151
return nil , err
154
152
}
@@ -173,7 +171,7 @@ func (s *Service) authProcess(ctx context.Context, req *auth.AttributeContext_Ht
173
171
err := s .validateTokens (ctx , provider , sessionData , sessionCookieName , sessionId )
174
172
if err != nil {
175
173
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 )
177
175
if err != nil {
178
176
return nil , err
179
177
}
@@ -199,16 +197,12 @@ func (s *Service) retriveTokens(ctx context.Context, provider *OIDCProvider, ses
199
197
sessionData .RefreshToken = tokens .RefreshToken
200
198
sessionData .AccessToken = tokens .AccessToken
201
199
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))
205
200
206
201
enc , err := session .EncodeToken (ctx , [32 ]byte (s .secretKey ), sessionData )
207
202
if err != nil {
208
203
slog .Error ("error encrypting session data" , slog .String ("err" , err .Error ()))
209
204
return err
210
205
}
211
- slog .Debug ("Encrypted SessionData" , slog .Int ("byte_len" , len (enc )))
212
206
213
207
// store session data in cache
214
208
if err := s .store .Set (ctx , sessionId , enc ); err != nil {
@@ -228,6 +222,7 @@ func (s *Service) validateTokens(ctx context.Context, provider *OIDCProvider, d
228
222
return nil
229
223
}
230
224
225
+ slog .Debug ("Token expired, refreshing token..." )
231
226
if expired && d .RefreshToken == "" {
232
227
return errors .New ("token expired and no refresh token found, add scope=offline_access to the auth request to get a refresh token" )
233
228
}
@@ -239,9 +234,8 @@ func (s *Service) validateTokens(ctx context.Context, provider *OIDCProvider, d
239
234
d .RefreshToken = t .RefreshToken
240
235
d .AccessToken = t .AccessToken
241
236
d .IdToken = t .IDToken
242
- d .Expiry = timestamppb .New (t .Expiry )
243
237
244
- slog .Debug ("Token refreshed, updating session cookie" , slog . String ( "expire" , t . Expiry . String ()) )
238
+ slog .Debug ("Token refreshed, updating session" )
245
239
enc , err := session .EncodeToken (ctx , [32 ]byte (s .secretKey ), d )
246
240
if err != nil {
247
241
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
255
249
return nil
256
250
}
257
251
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 ) {
259
253
slog .Debug ("Creating new session" )
260
254
var headers []* core.HeaderValueOption
261
255
@@ -266,7 +260,6 @@ func (s *Service) newSession(ctx context.Context, sourceIP, requestedURL, sessio
266
260
}
267
261
slog .Debug ("setting requested url" , slog .String ("requested_url" , requestedURL ))
268
262
sessionData .RequestedUrl = requestedURL
269
- sessionData .SourceIp = sourceIP
270
263
271
264
enc , err := session .EncodeToken (ctx , [32 ]byte (s .secretKey ), sessionData )
272
265
if err != nil {
@@ -292,28 +285,26 @@ func (s *Service) newSession(ctx context.Context, sourceIP, requestedURL, sessio
292
285
return append (headers , s .setCookie (cookie )... ), nil
293
286
}
294
287
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 ) {
296
289
var sessionData * pb.SessionData
297
- var cookie * http. Cookie
290
+ var sessionId string
298
291
299
292
for _ , c := range s .getCookies (req ) {
300
293
if c .Name == cookieName {
301
294
if c .Valid () != nil {
302
295
return nil , ""
303
296
}
304
297
slog .Debug ("found a cookie 👌" , slog .String ("cookie_name" , c .Name ))
305
- cookie = c
298
+ sessionId = c . Value
306
299
}
307
300
}
308
301
309
- if cookie == nil {
310
- slog .Debug ("no cookie found" )
302
+ if sessionId == "" {
303
+ slog .Debug ("no sessionId found in cookie " )
311
304
return nil , ""
312
305
}
313
306
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 ))
317
308
d , err := s .store .Cache .Get (ctx , sessionId )
318
309
if err != nil {
319
310
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
325
316
slog .Error ("error decrypt session data" , slog .String ("err" , err .Error ()))
326
317
return nil , ""
327
318
}
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
- }
334
319
335
320
return sessionData , sessionId
336
321
}
@@ -428,27 +413,3 @@ func (s *Service) authResponse(success bool, httpStatusCode envoy_type.StatusCod
428
413
},
429
414
}
430
415
}
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
- }
0 commit comments