2012-12-09 27 views
14

Tôi đang sử dụng Passport.js để làm chứng thực, và mỗi Google's OAuth2 documentation, tôi đi qua trong một biến trạng thái:Làm cách nào để truy cập thông số trạng thái OAuth bằng Passport.js?

app.get('/authenticate/googleOAuth', function(request, response) { 
    passport.authenticate('google', { 
    scope: 
    [ 
     'https://www.googleapis.com/auth/userinfo.profile', 
     'https://www.googleapis.com/auth/userinfo.email' 
    ], 
    state: { blah: 'test' } 
    })(request, response); 
}); 

Tuy nhiên, tôi dường như không thể truy cập vào biến mà vào một ngày sau:

passport.use(new googleStrategy(
{ 
    clientID: '...', 
    clientSecret: '...', 
    callbackURL: '...', 
    passReqToCallback: true 
}, 
function(request, accessToken, refreshToken, profile, done) { 
    console.log('state: ' + request.query.state); 
    login(profile, done); 
})); 

request.query.state không được xác định. request.param ("state") cũng không hoạt động.

Làm cách nào để nhận được biến đó sau khi gọi lại xác thực?

Trả lời

0

Thử nghiệm điều này một thời gian ngắn, sử dụng Node.js v0.8.9, thông số được cấu hình theo thời gian cho yêu cầu ủy quyền Google OAuth 2.0 cuối cùng được định dạng thông qua phương thức getAuthorizeUrl trong thư viện node-auth. Phương pháp này dựa vào querystring.stringify định dạng URL redirect:

exports.OAuth2.prototype.getAuthorizeUrl= function(params) { 
    var params= params || {}; 
    params['client_id'] = this._clientId; 
    params['type'] = 'web_server'; 
    return this._baseSite + this._authorizeUrl + "?" + querystring.stringify(params); 
} 

(Trên sao chép từ https://github.com/ciaranj/node-oauth/blob/efbce5bd682424a3cb22fd89ab9d82c6e8d68caa/lib/oauth2.js#L123).

nghiệm trong giao diện điều khiển bằng cách sử dụng thông số trạng thái mà bạn chỉ định:

querystring.stringify({ state: { blah: 'test' }}) =>'state='

Là một khắc phục, bạn có thể thử JSON mã hóa đối tượng của bạn, hoặc sử dụng một chuỗi duy nhất, mà nên giải quyết của bạn vấn đề. Sau đó, bạn có thể truy cập vào state, trong trình xử lý yêu cầu gọi lại, qua req.query.state. Hãy nhớ JSON.parse(req.query.state) khi truy cập vào nó.

+0

tại sao 'scope'? Tôi nghĩ rằng đó là 'querystring.stringify ({state: {blah: 'test'}})', phải không? –

+0

@ThomasLeduc Ah vâng, bạn nói đúng. Tôi sẽ cập nhật. –

11

Lý do điều này không hiệu quả là vì bạn đang chuyển trạng thái như một đối tượng thay vì một chuỗi. Có vẻ như hộ chiếu không xâu chuỗi giá trị đó cho bạn. Nếu bạn muốn vượt qua một đối tượng thông qua các param nhà nước, bạn có thể làm một cái gì đó như thế này:

passport.authenticate("google", { 
    scope: [ 
    'https://www.googleapis.com/auth/userinfo.profile', 
    'https://www.googleapis.com/auth/userinfo.email' 
    ], 
    state: base64url(JSON.stringify(blah: 'test')) 
})(request, response); 

Như Rob DiMarco lưu ý trong câu trả lời của mình, bạn có thể truy cập vào state param trong callback req.query đối tượng.

Tôi không chắc chắn trạng thái ứng dụng mã hóa và chuyển nó vào thông số state là một ý tưởng tuyệt vời. OAuth 2.0 RFC Section 4.1.1 xác định trạng thái là "giá trị mờ". Nó được thiết kế để sử dụng cho CSRF protection. Một cách tốt hơn để duy trì trạng thái ứng dụng từ lúc yêu cầu uỷ quyền và gọi lại có thể là để:

  1. tạo ra một số state giá trị tham số (hash của cookie, ví dụ)
  2. kiên trì trạng thái ứng dụng với state như một định danh trước khi bắt đầu các yêu cầu cấp phép
  3. lấy trạng thái ứng dụng trong xử lý yêu cầu gọi lại bằng cách sử dụng state param qua lại từ Google
Các vấn đề liên quan