Resep Nginx: CAS (Layanan Otorisasi Pusat)

Untuk menyiapkan layanan otorisasi pusat, kita perlu nginx sendiri dan sesi terenkripsi , gema , header-more , auth_request , eval , set-misc plugins . (Saya memberi tautan ke garpu saya, karena saya membuat beberapa perubahan yang tidak dapat didorong ke repositori asli sejauh ini. Anda juga dapat menggunakan gambar yang sudah jadi .)

Untuk bagian server, tambahkan pembuatan token ke konfigurasi server dari ESIA , otorisasi dasar atau 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; #       } 
dan validasi 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; #       } 

Dan dalam konfigurasi server klien, pertama-tama kita atur

 encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456"; 

Selanjutnya, untuk berjaga-jaga, nonaktifkan header otorisasi

 more_clear_input_headers Authorization; 

Sekarang kami melindungi semuanya dengan otorisasi

 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; #   } 

Untuk pengguna yang berwenang, kami menampilkan konten dari folder mereka

 location / { alias html/$remote_user/; } 

Dan dengan tidak adanya otorisasi, kami mengalihkan ke layanan otorisasi pusat

 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 -    } 

Setelah otorisasi berhasil, layanan otorisasi pusat mengarahkan kami ke yang ditentukan

 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/id456634/


All Articles