19
19
#include "ngx_http_auth_jwt_string.h"
20
20
21
21
#include <stdio.h>
22
+ #include <string.h>
22
23
23
24
typedef struct {
24
25
ngx_str_t auth_jwt_loginurl ;
@@ -509,19 +510,44 @@ ngx_http_auth_jwt_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
509
510
510
511
static char * getJwt (ngx_http_request_t * r , ngx_str_t auth_jwt_validation_type )
511
512
{
512
- static const ngx_str_t authorizationHeaderName = ngx_string ("Authorization" );
513
+ ngx_str_t authorizationHeaderName = ngx_string ("Authorization" );
513
514
ngx_table_elt_t * authorizationHeader ;
514
515
char * jwtPtr = NULL ;
515
516
ngx_str_t jwtCookieVal ;
517
+ ngx_str_t jwtQueryVal ;
516
518
ngx_int_t n ;
517
519
ngx_int_t bearer_length ;
518
520
ngx_str_t authorizationHeaderStr ;
519
521
520
522
ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "auth_jwt_validation_type.len %d" , auth_jwt_validation_type .len );
523
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "auth_jwt_validation_type: %s" , auth_jwt_validation_type .data );
521
524
522
- if (auth_jwt_validation_type .len == 0 || (auth_jwt_validation_type .len == sizeof ("AUTHORIZATION" ) - 1 && ngx_strncmp (auth_jwt_validation_type .data , "AUTHORIZATION" , sizeof ("AUTHORIZATION" ) - 1 )== 0 ))
525
+ if (auth_jwt_validation_type .len == 0 || (auth_jwt_validation_type .len == sizeof ("AUTHORIZATION= " ) - 1 && ngx_strncmp (auth_jwt_validation_type .data , "AUTHORIZATION= " , sizeof ("AUTHORIZATION= " ) - 1 )== 0 ))
523
526
{
524
- // using authorization header
527
+ auth_jwt_validation_type .data += sizeof ("AUTHORIZATION=" );
528
+ auth_jwt_validation_type .len -= sizeof ("AUTHORIZATION=" );
529
+
530
+ authorizationHeader = search_headers_in (r , authorizationHeaderName .data , authorizationHeaderName .len );
531
+ if (authorizationHeader != NULL )
532
+ {
533
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "Found authorization header len %d" , authorizationHeader -> value .len );
534
+
535
+ bearer_length = authorizationHeader -> value .len - (auth_jwt_validation_type .len );
536
+
537
+ if (bearer_length > 0 )
538
+ {
539
+ authorizationHeaderStr .data = authorizationHeader -> value .data + auth_jwt_validation_type .len - 1 ;
540
+ authorizationHeaderStr .len = bearer_length ;
541
+
542
+ jwtPtr = ngx_str_t_to_char_ptr (r -> pool , authorizationHeaderStr );
543
+
544
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "Authorization header: %s" , jwtPtr );
545
+ }
546
+ }
547
+ }
548
+ else if (auth_jwt_validation_type .len == 0 || (auth_jwt_validation_type .len == sizeof ("AUTHORIZATION" ) - 1 && ngx_strncmp (auth_jwt_validation_type .data , "AUTHORIZATION" , sizeof ("AUTHORIZATION" ) - 1 )== 0 ))
549
+ {
550
+ // using authorization header
525
551
authorizationHeader = search_headers_in (r , authorizationHeaderName .data , authorizationHeaderName .len );
526
552
if (authorizationHeader != NULL )
527
553
{
@@ -540,6 +566,22 @@ static char * getJwt(ngx_http_request_t *r, ngx_str_t auth_jwt_validation_type)
540
566
}
541
567
}
542
568
}
569
+ else if (auth_jwt_validation_type .len > sizeof ("QUERY=" ) && ngx_strncmp (auth_jwt_validation_type .data , "QUERY=" , sizeof ("QUERY=" ) - 1 )== 0 )
570
+ {
571
+ auth_jwt_validation_type .data += sizeof ("QUERY=" ) - 1 ;
572
+ auth_jwt_validation_type .len -= sizeof ("QUERY=" ) - 1 ;
573
+
574
+ // get the value from query
575
+ n = ngx_http_arg (r , auth_jwt_validation_type .data , auth_jwt_validation_type .len , & jwtQueryVal );
576
+ if (n != NGX_DECLINED )
577
+ {
578
+ jwtPtr = ngx_str_t_to_char_ptr (r -> pool , jwtQueryVal );
579
+ }
580
+ else
581
+ {
582
+ ngx_log_error (NGX_LOG_ERR , r -> connection -> log , 0 , "error get value from query param" );
583
+ }
584
+ }
543
585
else if (auth_jwt_validation_type .len > sizeof ("COOKIE=" ) && ngx_strncmp (auth_jwt_validation_type .data , "COOKIE=" , sizeof ("COOKIE=" ) - 1 )== 0 )
544
586
{
545
587
auth_jwt_validation_type .data += sizeof ("COOKIE=" ) - 1 ;
@@ -553,6 +595,78 @@ static char * getJwt(ngx_http_request_t *r, ngx_str_t auth_jwt_validation_type)
553
595
jwtPtr = ngx_str_t_to_char_ptr (r -> pool , jwtCookieVal );
554
596
}
555
597
}
598
+ else if (auth_jwt_validation_type .len > sizeof ("PIPELINE=" ) && ngx_strncmp (auth_jwt_validation_type .data , "PIPELINE=" , sizeof ("PIPELINE=" ) - 1 )== 0 )
599
+ {
600
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "auth_jwt_validation_type: %s" , auth_jwt_validation_type .data );
601
+ // get the value from header first
602
+ // than get value from cookie
603
+ // and from query
604
+ // sepparator is a comma ','
605
+ // example PIPELINE=Bearer,session,token
606
+ auth_jwt_validation_type .data += sizeof ("PIPELINE=" ) - 1 ;
607
+ auth_jwt_validation_type .len -= sizeof ("PIPELINE=" ) - 1 ;
608
+
609
+ // auth_jwt_validation_type -> Bearer,token,session
610
+ ngx_str_t pipeline_values [3 ];
611
+ for (int i = 0 ;i < 3 ;i ++ )
612
+ {
613
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "step: %d, auth_jwt_validation_type: %s" , i , auth_jwt_validation_type .data );
614
+ size_t j = 0 ;
615
+ for (;j < auth_jwt_validation_type .len ;j ++ )
616
+ {
617
+ if (auth_jwt_validation_type .data [j ] == ',' || auth_jwt_validation_type .data [j ] == '\0' )
618
+ {
619
+ pipeline_values [i ].data = ngx_palloc (r -> pool , j + 1 );
620
+ pipeline_values [i ].len = j ;
621
+ ngx_memcpy (pipeline_values [i ].data , auth_jwt_validation_type .data , j );
622
+ pipeline_values [i ].data [j ] = '\0' ;
623
+ auth_jwt_validation_type .data += j + 1 ;
624
+ auth_jwt_validation_type .len -= j ;
625
+ break ;
626
+ }
627
+ }
628
+
629
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "j: %d and len: %d" , j , auth_jwt_validation_type .len );
630
+
631
+ }
632
+
633
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "pipeline_values0: %s" , pipeline_values [0 ].data );
634
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "pipeline_values1: %s" , pipeline_values [1 ].data );
635
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "pipeline_values2: %s" , pipeline_values [2 ].data );
636
+
637
+ // get auth header
638
+ authorizationHeader = search_headers_in (r , authorizationHeaderName .data , authorizationHeaderName .len );
639
+ if (authorizationHeader != NULL )
640
+ {
641
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "Found authorization header len %d" , authorizationHeader -> value .len );
642
+
643
+ bearer_length = authorizationHeader -> value .len - pipeline_values [0 ].len - 1 ;
644
+
645
+ if (bearer_length > 0 )
646
+ {
647
+ authorizationHeaderStr .data = authorizationHeader -> value .data + pipeline_values [0 ].len + 1 ;
648
+ authorizationHeaderStr .len = bearer_length ;
649
+
650
+ jwtPtr = ngx_str_t_to_char_ptr (r -> pool , authorizationHeaderStr );
651
+
652
+ ngx_log_error (NGX_LOG_DEBUG , r -> connection -> log , 0 , "Authorization header: %s" , jwtPtr );
653
+ }
654
+ }
655
+
656
+ // get the cookie
657
+ n = ngx_http_parse_multi_header_lines (& r -> headers_in .cookies , & pipeline_values [1 ], & jwtCookieVal );
658
+ if (n != NGX_DECLINED )
659
+ {
660
+ jwtPtr = ngx_str_t_to_char_ptr (r -> pool , jwtCookieVal );
661
+ }
662
+
663
+ // get the value from query
664
+ n = ngx_http_arg (r , pipeline_values [2 ].data , pipeline_values [2 ].len , & jwtQueryVal );
665
+ if (n != NGX_DECLINED )
666
+ {
667
+ jwtPtr = ngx_str_t_to_char_ptr (r -> pool , jwtQueryVal );
668
+ }
669
+ }
556
670
557
671
return jwtPtr ;
558
672
}
0 commit comments