nginx

7

पर एक बार कुकी का उपयोग करके बहुत ही सरल प्रमाणीकरण मेरे पास केवल 3 उपभोक्ताओं द्वारा निजी खपत के लिए एक साइट है। यह सरल HTML है जो सीधे nginx द्वारा परोसा जाता है लेकिन कार्यालय के अंदर और बाहर खपत के लिए लक्षित है।nginx

मैं एक साधारण पासवर्ड या प्रमाणीकरण योजना चाहता हूं। मैं HTTP ऑथ का उपयोग कर सकता हूं लेकिन ये काफी बार समाप्त हो जाते हैं जो लोगों के उपयोग के लिए दर्द का कारण बनता है। मैं भी परेशान हूं कि किसी के लिए कुकीज से स्नीफ करना बहुत आसान है।

तो मुझे आश्चर्य है कि क्या मैं जावास्क्रिप्ट में अपने ब्राउज़र पर एक अद्वितीय लंबी आईडी के साथ एक कुकी सेट कर सकता हूं और किसी भी तरह से केवल अनुरोध स्वीकार करने के लिए nginx को बता सकता हूं (एक विशेष सबडोमेन के लिए) जिसमें यह कुकी है।

क्या यह इतना आसान है? मैं

  1. बताई nginx ब्राउज़र में कुकी
  2. से कैसे फिल्टर करने के लिए करते हैं, उस कुकी का कभी समाप्त नहीं होता सेट?

उत्तर

6

एक कुकी द्वारा Nginx फिल्टर करने के लिए, यदि कुकी वर्तमान 3 लोगों की है कि उपयोग कर सकते है के लिए अपने असली कार्रवाई, नहीं है, और फिर उदाहरण के लिए आप कुछ कार्रवाई प्रदर्शन कर सकता है:

server { 
    ... 
    if ($http_cookie !~ 'secretvalue') { 
     return 401; 
    } 
    location/{ 
     #Auth'd behaviour 
    } 
} 

और उस कुकी समाप्त हो रहा है, एक पेज अपने सर्वर का होस्ट नाम पर है पर अपने ब्राउज़र का JavaScript कंसोल ऊपर आग, और कभी प्रवेश नहीं स्थापित करने के लिए:

document.cookie = 'cookie=secretvalue;max-age=3153600000;path=/'; 

तकनीकी रूप से हमेशा के लिए नहीं है यही कारण है कि, ख 100 साल के लिए यह करना चाहिए। यदि आप इतने इच्छुक हैं और path को आसानी से समायोजित कर सकते हैं तो आप RFC1123 प्रारूप में पूर्ण दिनांक के लिए expires= का भी उपयोग कर सकते हैं।

ब्राउज़र ऐड-ऑन भी हैं जो आपको मनमाने ढंग से कुकीज़ बनाने की अनुमति देंगे, लेकिन सभी आधुनिक ब्राउज़रों में जावास्क्रिप्ट कंसोल है।

+1

मुझे लगता है कि आप का मतलब –

+0

अच्छा पकड़, @doronaviguy ~:

यहाँ config है!। उत्तर अपडेट किया गया! – davidjb

1

एक बहुत ही सरल दिखने वाला समाधान है जो मुझे a blog post by Christian Stocker से मिला है। यह निम्नलिखित नियमों को लागू करता है:

  1. यदि उपयोगकर्ता एक आंतरिक आईपी पर है, तो उन्हें अनुमति है।
  2. यदि उपयोगकर्ता के पास कुकी सेट है, तो उन्हें अनुमति है।
  3. न मैचों, तो उपयोगकर्ता बुनियादी HTTP प्रमाणीकरण के साथ प्रस्तुत किया है, और अगर वे सफलतापूर्वक प्रमाणित एक दीर्घकालिक कुकी सेट है

यह वास्तव में दोनों दुनिया का सबसे अच्छा है।

map $cookie_letmein $mysite_hascookie { 
    "someRandomValue" "yes"; 
    default   "no"; 
} 

geo $mysite_geo { 
    192.168.0.0/24 "yes": #some network which should have access 
    10.10.10.0/24 "yes": #some other network which should have access 
    default  "no"; 
} 


map $mysite_hascookie$mysite_geo $mysite_authentication{ 
    "yesyes" "off"; #both cookie and IP are correct => OK 
    "yesno" "off"; #cookie is ok, but IP not => OK 
    "noyes" "off"; #cookie is not ok, but IP is ok => OK 
    default "Your credentials please"; #everythingles => NOT OK 
} 

server { 
    listen 80; 
    server_name mysite.example.org; 
    location/{ 
    auth_basic $mysite_authentication; 
    auth_basic_user_file htpasswd/mysite; 
    add_header Set-Cookie "letmein=someRandomValue;max-age=3153600000;path=/"; #set that special cookie, when everything is ok 
    proxy_pass http://127.0.0.1:8000/; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $remote_addr; 
    } 
}