2015-08-06 20 views
5

Xin chào Tôi muốn hỗ trợ cả xác thực dựa trên mẫu và xác thực cơ bản http trong ứng dụng của tôi. Mọi thứ hoạt động như mong đợi trừ khi tôi sử dụng auth dựa trên biểu mẫu thông qua angularj với thông tin đăng nhập sai.cách ngăn chặn tiêu đề xác thực www khi sử dụng hộ chiếu-http Basic + hộ chiếu-kết hợp địa phương

Thay vì có mã góc của tôi xử lý 401, trình duyệt hiển thị hộp thoại xác thực BASIC, do tiêu đề WWW-Authenticate gây ra.

Làm cách nào để ngăn tiêu đề đó được thêm khi chiến lược địa phương được sử dụng? Hoặc làm cách nào tôi có thể hỗ trợ cả hai cơ chế theo một cách khác?

Tôi sử dụng tuyến đường sau trong ứng dụng dựa trên tốc độ của mình.

api.post('/authenticate', passport.authenticate(['local', 'basic'], { session: false }), function (req, res) { 

Điều này cho phép cả hai phương thức xác thực trên url đó. Tôi lặp lại, khi tôi sử dụng thông tin đăng nhập sai bằng cách sử dụng formbased nó cho tôi thấy hộp thoại auth cơ bản (tôi không muốn điều đó).

Sau đây là cách tôi đăng ký chiến lược.

passport.use(new BasicStrategy({ realm: 'Authentication failed. Wrong username or password.'}, verifyLocalUser)); 
passport.use(new LocalStrategy(verifyLocalUser)); 

Đây là cách phương pháp verifyUser của tôi trông giống như ...

var verifyLocalUser = function (username, password, next) { 
    User.findOne({ 
     username: username 
    }).select('fullname admin username password').exec(function (err, user) { 
     if (err) { 
      return next(err); 
     } 

     if (user && user.comparePasswords(password)) { 
      return next(null, user); 
     } else { 
      next(null, false, { message: 'Authentication failed. Wrong username or password.' }); 
     } 
    }); 
} 

Có ai biết làm thế nào để hỗ trợ nhiều phương pháp xác thực bằng passport.js?

Để hoàn chỉnh, đây là mã góc mà xác tôi ...

authFactory.signIn = function (username, password) { 
     return $http.post('/api/authenticate', { 
      username: username, 
      password: password 
     }).then(function (res) { 
      AuthToken.setToken(res.data.token); 
      return res.data; 
     }, function (res) { 
      console.warn(res); 
     }); 
    }; 

Trả lời

0

thay vì điều này:

next(null, false, { message: 'Authentication failed. Wrong username or password.' }); 

Bạn có thể sử dụng này:

cb(new YourCustomError()) 

Và " YourCustomError "có thể có một tin nhắn, cho tôi của tôi" YourCustomError "trông giống như:

class HttpError extends Error { 
    constructor (msg = 'Invalid Request', status = 400) { 
    super(msg) 
    this.status = status 
    } 
} 

class Forbidden extends HttpError { 
    constructor (msg = 'Forbidden') { 
    super(msg, 403) 
    } 
} 

Hoặc có thể new Error(<message>) cũng hoạt động bình thường cho bạn, quá

Các vấn đề liên quan