2016-01-19 20 views
5

Tôi hiện đang chạy một ứng dụng Node.js, với một API và các tập tin phục vụ (tôi biết nginx có thể xử lý nó, nhưng tôi đã không được sử dụng nó lúc đầu).Auth cơ bản và JWT

Tôi chỉ đơn giản sử dụng nó để có một xác thực cơ bản đơn giản, điều này không xảy ra đơn giản.

Dưới đây là cấu hình nginx tôi:

upstream nodejsapp { 
    server 127.0.0.1:1337; 
    keepalive 15; 
    } 

    server { 
    listen 80 default_server; 

    auth_basic "Restricted"; 
    auth_basic_user_file /etc/nginx/.htpasswd; 
    proxy_redirect off; 

    location/{ 
     proxy_pass http://nodejsapp; 

     proxy_set_header Connection "Keep-Alive"; 
     proxy_set_header Proxy-Connection "Keep-Alive"; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 
    } 
    } 

File /etc/nginx/.htpasswd chỉ là user:encryptedpassword và là tốt.

Với cấu hình này, khi tôi đi đến IP của tôi nó:

  • hỏi tôi người dùng và mật khẩu
  • bắt đầu để tải trang
  • (đôi khi) yêu cầu một lần nữa cho người dùng và mật khẩu
  • hoàn thành để tải trang

Cho đến giờ rất tốt, ngay cả khi nó đã hỏi mật khẩu gấp đôi.

Ứng dụng Node.js có xác thực JWT, khi tôi đăng nhập, trang web tải lại và từ đây, nó yêu cầu vô thời hạn cho người dùng và mật khẩu (auth cơ bản), miễn là tôi nhấp vào đăng nhập. JWT nằm trong bộ nhớ cục bộ của tôi. Nếu tôi nhấp vào hủy bỏ trên dấu nhắc auth cơ bản, JWT sẽ bị xóa và tôi đăng xuất, và nó ... yêu cầu một lần nữa cho auth cơ bản.

Đây là trên Chrome. Với Firefox và Safari, sau khi đăng nhập JWT, nó sẽ tự động xóa mã thông báo khỏi bộ nhớ cục bộ (và tôi đã đăng xuất).

Rất khó giải thích và tôi không thể hiển thị cho bạn trang web. Tóm lại, vấn đề chính là JWT (của ứng dụng node.js) bị xóa.

+0

Tôi không chắc nó có thể trộn auth cơ bản và JWT. Tôi có thể sai, nhưng theo như tôi biết, cả hai phương pháp đều sử dụng tiêu đề yêu cầu 'Authorization', vì vậy không có gì đáng ngạc nhiên khi chúng bị nghi ngờ. – Curious

+0

Vâng, sau khi một số nghiên cứu, tôi xác nhận nó có thể là vấn đề – Cohars

+0

Đừng nghĩ rằng tôi có thể tìm thấy bất kỳ sửa chữa cho việc này. – Cohars

Trả lời

4

Khi tôi nhận ra rằng sự cố là xung đột giữa Basic Auth và JWT (như @Curious được đề xuất trong phần thưởng) và cả hai đều sử dụng tiêu đề Authorization, giải pháp khá dễ dàng.

Tôi định cấu hình ứng dụng giao diện người dùng của mình để gửi JWToken qua tiêu đề tùy chỉnh, **JWTAuthorization**, vì vậy khi yêu cầu truy cập vào máy chủ, nó chứa cả hai tiêu đề Authorization & JWTAuthorization. Sau đó, nó là khá đơn giản, sau khi auth cơ bản được thông qua, tôi chỉ thay thế các tiêu đề (ở đây về việc áp dụng Node.js, dựa trên Koa):

app.use(function *(next) { 
    this.headers.authorization = this.headers.jwtauthorization; 
    yield next; 
}); 
Các vấn đề liên quan