2012-12-02 22 views
8

Tôi đang sử dụng passport.js để xác thực người dùng. Tôi muốn có thể chuyển tên người dùng, được thu thập từ người dùng, điều này sẽ đến cuối quá trình xác thực để tôi có thể lưu tên người dùng khi tôi tạo người dùng (nếu nó chưa tồn tại). Tôi đã thử điều này:Làm cách nào để chuyển thông số qua chuỗi hộ chiếu của tôi?

app.get("/auth/google", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     scope: 
     [ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      "https://www.googleapis.com/auth/userinfo.email" 
     ] 
    })(request, response); 
}); 

app.get("/auth/google/callback", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     successRedirect: "/", 
     failureRedirect: "htm/error" 
    })(request, response); 
}); 

Cuộc gọi đến/auth/google in tên người dùng, nhưng bản in lại không xác định. Ngay cả khi tôi có thể nhận được tên người dùng để gọi lại, tôi vẫn không chắc chắn làm thế nào tôi sẽ nhận được nó vào chiến lược google. Vậy tôi có phải tạo chiến lược riêng của mình để làm việc này không?

Trả lời

7

Bạn có thể vượt qua tình trạng đối tượng để passport.authenticate, như vậy:

passport.authenticate("google", 
{ 
    scope: 
    [ 
     "https://www.googleapis.com/auth/userinfo.profile", 
     "https://www.googleapis.com/auth/userinfo.email" 
    ], 
    state: request.query.username 
})(request, response); 

Bạn có thể truy cập vào tiểu bang thông qua req.query.state.

Tên người dùng phải là một chuỗi chứ không phải đối tượng. Nếu bạn muốn lưu trữ một đối tượng trong tiểu bang, hãy gọi JSON.stringify trước và phân tích cú pháp trong đối tượng gọi lại.

1

Đối với bất kỳ ai sử dụng OpenID, req.query dường như bị ghi đè bởi tham số truy vấn OpenId và do đó không thể được chuyển trực tiếp. Tuy nhiên, bạn có thể đính kèm các biến vào req.session.

router.get('/auth/social', (req, res, next) => { 
    req.session.foo = req.query.foo; 
    next(); 
}, passport.authenticate('social')); 

và đừng quên đưa lá cờ passReqToCallback trong các tùy chọn chiến lược:

{ 
    passReqToCallback: true, 
    returnURL: config.app.returnUrl, 
    realm: config.app.realm, 
    apiKey: config.app.apiKey 
} 
+0

Có thể là phiên và cookie cũng được ghi đè bởi một chiến lược OpenID (https://github.com/liamcurry/hộ chiếu-hơi nước)? Tôi đã thử giải pháp của bạn, nhưng 'req.session.foo' là' undefined' trong đường gọi lại. – guest459473

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