2012-10-13 31 views
5

Tôi đang sử dụng chiến lược Passport-Linkedin cho Hộ chiếu có Express, cho phép người dùng đăng nhập bằng hồ sơ LinkedIn của họ.Làm cách nào để đặt máy chủ hiện tại cho chiến dịch Hộ chiếu callbackURL?

Tôi có đoạn mã sau:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "http://localhost:3000/auth/linkedin/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     // To keep the example simple, the user's LinkedIn profile is returned to 
     // represent the logged-in user. In a typical application, you would want 
     // to associate the LinkedIn account with a user record in your database, 
     // and return that user instead. 
     return done(null, profile); 
    }); 
    } 
)); 

On line 4, tôi phải thiết lập các URL gọi lại toàn bằng tay. Tôi đã có một chuỗi cho sản xuất và một cho phát triển, nhưng URL của tôi tiếp tục thay đổi, và do đó, làm các cảng (tôi sử dụng 2 máy để phát triển).

Làm cách nào để tự động đặt phần đầu tiên của URL (http://localhost:3000)? Có tài sản của express hoặc app sẽ cho phép tôi làm điều đó không? Tôi có cần phải sử dụng số điện thoại app.use(function(req, res){}); không?

Cảm ơn!

Trả lời

4

Câu hỏi cũ, có thể câu trả lời y chỉ hợp lệ cho các phiên bản mới hơn. Tuy nhiên nếu ai đó chạy vào điều này, như tôi, giải pháp chỉ là để không chỉ định một hostname trong callbackURL:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "/auth/linkedin/callback" 
    }, 

Để có được điều này để làm việc cho Heroku https chuyển hướng, chúng ta phải nói với hệ thống để tin tưởng vào x-forwarded-protocol tiêu đề , bằng cách tin tưởng proxy:

passport.use(new LinkedInStrategy({ 
    consumerKey: config.linkedin.LINKEDIN_API_KEY, 
    consumerSecret: config.linkedin.LINKEDIN_SECRET_KEY, 
    callbackURL: "/auth/linkedin/callback", 
    proxy: true 
    }, 
+2

Nó không hoạt động nếu ứng dụng của bạn không chạy trên đường dẫn gốc, ví dụ như ứng dụng đang chạy trên '/ myapp' thay vì'/'. –

0

Trong config.js của tôi, tôi có một cfg.site_url, đó là một cách, hoặc bạn có thể nhìn vào req.host

http://expressjs.com/api.html#req.host

// Host: "example.com:3000" 
req.hostname 
// => "example.com" 

Không chắc chắn nếu bạn có một đối tượng req trong của bạn bối cảnh đó.

+0

Tôi bắt đầu bằng chuỗi cấu hình, nhưng tên máy chủ và cổng tiếp tục thay đổi. Tôi đang ở cấp ứng dụng - cách duy nhất để có được một req, theo như tôi biết, là thêm tuyên bố app.use mà tôi đã đề cập. Vấn đề là, sau đó nó được gọi cho mọi yêu cầu. –

+0

bạn có thể cung cấp phần mềm trung gian cho một yêu cầu của mình. Một cái gì đó như 'app.get ('/ whatever', loadConfigVariable, routes.whatever);' và 'app.locals.whatever = config.whatever' bên trong hàm loadConfigVariable. – chovy

+0

Đó là những gì tôi đã cố gắng tránh - một tuyến đường khác. Tôi tự hỏi liệu tôi có thể tìm thấy chức năng đó trong Passport không? –

0

Cuối cùng đã giải quyết vấn đề này bằng cách tự động xây dựng URL gọi lại từ các phần của URL và cổng thực tế. Không hài lòng với giải pháp này vì nó trông không thanh lịch, nhưng không thể tìm ra cách để lấy URL thực mà không cần thêm một cuộc gọi sử dụng phần mềm trung gian (mà tôi chắc chắn tác động đến hiệu năng nhiều hơn một chuỗi nối đơn giản).

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