2016-01-12 20 views
6

Tôi đang phát triển một ứng dụng MEAN. Tôi đang sử dụng hộ chiếu để xác thực chiến lược địa phương, facebook và google.cách xử lý gọi lại hộ chiếu facebook trong ứng dụng khách góc?

Tôi đang sử dụng ứng dụng khách góc cạnh. Tất cả các định tuyến được xử lý tại khách hàng. Tôi chỉ tiêu thụ dữ liệu máy chủ apis.

Khi sử dụng chiến lược hộ chiếu-facebook, tôi đang sử dụng mã bên dưới tại máy chủ nút theo tài liệu hộ chiếu.

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); 
    app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { 
     successRedirect : '/home', 
     failureRedirect : '/login', 
     scope:['email'] 
    })); 

Vấn đề tôi đang phải đối mặt là khi người dùng nhấp chuột vào "Đăng nhập qua tài khoản Facebook" nút

<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

khách hàng sẽ truy cập vào "/ auth/facebook" tuyến đường mà cuối cùng sẽ chuyển hướng người dùng đến trang facebook để phê chuẩn thông tin đăng nhập của người dùng.

Sau khi xác thực thành công, người dùng sẽ được chuyển hướng đến tuyến đường "/ nhà" như được xác định trong giá trị "successRedirect".

Bây giờ, tôi muốn sử dụng chức năng gọi lại tùy chỉnh thay vì xác định chuyển hướng để thành công hay thất bại. Nó sẽ giống như dưới đây:

vấn đề
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){ 
    if(err){ 
      throw err; 
     } 
     else if(user === 'userexists'){ 
      res.json({ 
       'state':false, 
       'message':'User with this e-mail already exists' 
      }); 
     } 
     else{ 
      req.logIn(user,function(loginErr){ 
       if(loginErr){ 
        throw loginErr; 
       } 
       res.json({ 
        'state':true, 
        'message':'You logged in successfully!' 
       }); 
      }); 
     } 
})); 

Gốc tôi đang phải đối mặt ở đây, tôi không thể sử dụng trên gọi lại tùy chỉnh như khách hàng không gọi "auth/facebook/callback" lộ trình, nó được gọi bằng facebook. Vì vậy, không có trình xử lý thành công nào đang chờ để bắt được phản hồi của cuộc gọi lại ở phía máy khách !!

Tôi muốn một số cách để nhận phản hồi ở dạng json ở máy khách để loại bỏ chuyển hướng phía máy chủ và cũng có cách để truyền thông điệp và tên người dùng cho khách hàng sau khi xác thực thành công bằng facebook.

Tôi sắp từ bỏ hộ chiếu. Hy vọng cho bất kỳ giải pháp có thể trước khi loại bỏ rất nhiều mã!

Cảm ơn

Trả lời

2

Điều này có thể được thực hiện bằng cách chuyển hướng đến một điểm cuối khác trong trình xử lý gọi lại facebook. Không cần phải làm res.json() khi gọi lại từ facebook vì họ chỉ thực hiện yêu cầu đó để cho bạn biết nếu auth thất bại hoặc thành công. From their docs:

// GET /auth/facebook/callback 
// Use passport.authenticate() as route middleware to authenticate the 
// request. If authentication fails, the user will be redirected back to the 
// login page. Otherwise, the primary route function function will be called, 
// which, in this example, will redirect the user to the home page. 

lợi nhuận Vì vậy, facebook kiểm soát quá trình yêu cầu hệ lại với bạn khi họ gọi /auth/fb/callback nhưng đó là tùy thuộc vào bạn làm gì tiếp theo. Kể từ khi người dùng được xác thực thành công, bạn sẽ có req.user có sẵn trong toàn bộ phiên. Tại thời điểm này, bạn có thể chuyển hướng đến một cái gì đó như có trong ví dụ /account và kiểm tra xem req.user với req.isAuthenticated() và hoàn thành luồng bạn mong muốn hay không.

+0

Cảm ơn rất nhiều câu trả lời rõ ràng! – Designeer

+0

@Designeer bạn được chào đón. Đăng lại trong trường hợp bạn tìm thấy nhiều vấn đề hơn: D – onel0p3z

+0

@ onel0p3z Tôi đang làm điều tương tự trong reactjs thay vì góc cạnh. Máy chủ của tôi ở trên Node và tôi đang sử dụng Express. Tôi đã triển khai thành công hộ chiếu-facebook ở phía máy chủ của tôi. Bây giờ tôi đang gọi '/ auth/facebook' từ phản ứng thông qua thẻ neo. Nhưng tôi không có ý tưởng làm thế nào để lấy lại phản ứng cho rằng trong phản ứng, vì nó được xử lý bởi máy chủ duy nhất và tôi không muốn xử lý nó thông qua response.redirect trên máy chủ .. Bạn có thể vui lòng đề nghị làm thế nào để xử lý kịch bản này? – Vijay

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