Recetas Nginx: CAS (Servicio de autorización central)

Para preparar el servicio de autorización central, necesitamos nginx y sus complementos encriptado-sesión , echo , encabezados-más , auth_request , eval , set-misc . (Di enlaces a mis bifurcaciones, porque hice algunos cambios que hasta ahora no se pudieron insertar en los repositorios originales. También puede usar la imagen preparada ).

Para la parte del servidor, agregue la generación de tokens a la configuración del servidor desde ESIA , autorización básica o LDAP

location =/service { set_decode_base64 $auth_decode $cookie_auth; #    set_decrypt_session $auth_decrypt $auth_decode; #    if ($auth_decrypt) { #   ,     encrypted_session_expires 60; #     1  (1 * 60 = 60) set_encrypt_session $token_encrypt $auth_decrypt; #   set_encode_base64 $token_encode $token_encrypt; #   set_escape_uri $token_escape $token_encode; #   set_unescape_uri $service_unescape $arg_service; #       return 303 $service_unescape&token=$token_escape; #       } 
y validación de token

 location =/serviceValidate { set_unescape_uri $token_unescape $arg_token; #   set_decode_base64 $token_decode $token_unescape; #   set_decrypt_session $token_decrypt $token_decode; #   return 200 $token_decrypt; #       } 

Y en la configuración del servidor cliente, primero establecemos

 encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456"; 

A continuación, por si acaso, deshabilite el encabezado de autorización

 more_clear_input_headers Authorization; 

Ahora protegemos todo con autorización

 auth_request /auth; location =/auth { internal; set_decode_base64 $auth_decode $cookie_auth; #    set_decrypt_session $auth_decrypt $auth_decode; #    if ($auth_decrypt = "") { return 401 UNAUTHORIZED; } #    ,      more_set_input_headers "Authorization: Basic $auth_decrypt"; #    basic (   $remote_user) echo -n OK; #   } 

Para usuarios autorizados, mostramos contenido de su carpeta

 location / { alias html/$remote_user/; } 

Y en ausencia de autorización, redirigimos al servicio de autorización central

 error_page 401 = @error401; location @error401 { set_escape_uri $request_uri_escape $request_uri; #   set_escape_uri $service_escape $scheme://$server_name:$server_port/login?request_uri=$request_uri_escape; #       return 303 https://$cas/service?service=$service_escape; #     ,  $cas -    } 

Después de una autorización exitosa, el servicio de autorización central nos redirige a la especificada

 location =/login { eval $auth { #      (    ) proxy_set_header X-Real-IP $remote_addr; #    proxy_pass $scheme://$cas:$server_port/serviceValidate?token=$arg_token; #   } if ($auth = "") { return 401 UNAUTHORIZED; } #    ,      encrypted_session_expires 43200; #     12  (12 * 60 * 60 = 43200) set_encrypt_session $auth_encrypt $auth; #  - set_encode_base64 $auth_encode $auth_encrypt; #   add_header Set-Cookie "Auth=$auth_encode; Max-Age=43200"; #      12  (12 * 60 * 60 = 43200) set $arg_request_uri_or_slash $arg_request_uri; #     set_if_empty $arg_request_uri_or_slash "/"; #    ,   set_unescape_uri $request_uri_unescape $arg_request_uri_or_slash; #   return 303 $request_uri_unescape; #     } 

Source: https://habr.com/ru/post/456634/


All Articles