2013-05-31 40 views
9

Tôi đang sử dụng nút, hiển thị và hộ chiếu có xác thực facebook.
tôi có các tuyến đường sau (khi /facebook/auth/callback là url callback):Lỗi xác thực hộ chiếu dẫn đến vòng chuyển hướng

function render(page, req, res) { 
    var user = null; 
    if (req.user) { 
     user = req.user.toObject(); 
     user.isLoggedIn = true; 
    } 
    res.render(page, { user: user }); 
} 
app.get('/auth-failure', function (req, res) { 
    res.render('auth-failure'); 
}); 
app.get('/auth-success', function (req, res) { 
    render('auth-success', req, res); 
}); 
app.get('/facebook/auth', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me', 'publish_actions']})); 
app.get('/facebook/auth/callback', passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' })); 

Khi xác thực thành công tôi đã xem trang auth-success như tôi mong đợi. Nhưng khi xác thực thất bại và facebook quay trở lại: http://localhost:3000/facebook/auth/callback?error_code=2102&error_message=User+is+not+a+test+user+owned+by+the+application#=

Tôi không có chế độ xem auth-failure! Thay vào đó, firefox trả về cho tôi trang:

enter image description here

Khi chạy trong chrome, tôi nhận được thông báo: enter image description here

tôi cố gắng để kiểm tra mọi thứ và tôi thay thế các bộ định tuyến thất bại trong việc:

app.get('/facebook/auth/callback', function (req, res) { 
    res.redirect('/auth-failure'); 
}); 

Và điều này hiển thị thành công chế độ xem auth-failure.
Sự cố với xác thực thất bại trên Facebook Passport.js là gì?
Tại sao nó trả lại cho tôi trang lỗi đó?

Về @ Matt Bakaitis bình luận:
Đây là tôi serialize và deserialize chức năng:

// serialize sessions 
passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findOne({ _id: id }, function (err, user) { 
     done(err, user); 
    }); 
}); 
+0

Nó xuất hiện các công trình ví dụ trong Firefox mặc dù. – jhtong

+0

@toiletfreak: Tôi đính kèm hình ảnh về hành vi sai trái này trong Firefox. – Naor

+0

Bạn có thay đổi mã passport.serialize hoặc passport.deserialize không? –

Trả lời

1

Tôi tin rằng đó là vì bạn đang sử dụng một callback tùy chỉnh và cần phải cung cấp một res phản đối như thế nào. ...

app.get('/facebook/auth/callback', function(req, res, next) { 
     passport.authenticate('facebook',.............. 
+0

Nhưng tôi đang làm chính xác những gì được viết ở đây: http://passportjs.org/guide/facebook/ – Naor

1

Tôi sẽ kích hoạt Fiddler để xem chính xác những gì được gửi qua dây.

1

Thực hiện thêm nghiên cứu, vì tôi cũng sử dụng passport.js để tích hợp với facebook (và những người khác), có vẻ như đây là báo cáo open issue cho hộ chiếu-oauth (hộ chiếu-facebook sử dụng).

Người đăng vấn đề đã có một cách giải quyết cho việc kiểm tra lỗi trên line 98 of the oauth2 code:

app.get('/auth/facebook', passport.authenticate('facebook')); 
    app.get('/auth/facebook/callback', 
      , function(req, res, next) { 
        if (req.query && !req.query.error && req.query.error_code) { 
         req.query.error = true; 
        } 
        next(); 
      } 
      , passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' } 
    ); 

Đối với biện pháp tốt, nó cũng là một ý tưởng tốt để kiểm tra lại các thiết lập của bạn trên Facebook và localhost của bạn được liệt kê trong (các) vị trí phù hợp. Ngoài ra, hãy kiểm tra để đảm bảo rằng mọi thứ khớp hoàn hảo trong Node.js. Tôi đã gặp vấn đề với hộ chiếu-twitter khi tôi thực hiện một lỗi đánh máy trong chuỗi cấu hình của tôi đã rất khó nắm bắt vì nó đã không ném một lỗi trong Node.js nhưng gây ra auth của tôi thất bại trong một cách khó khăn để nắm bắt. Dưới đây là một số liên kết với những người có cùng error_message như bạn và họ dường như chỉ ra các vấn đề cấu hình facebook-side:

+0

Có một lỗi trong mã? Nó thiếu một dấu ngoặc đơn hoặc một cái gì đó tương tự? – zehelvion

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