2011-03-25 35 views
21

Tôi đang cố gắng để OAuth hoạt động trên node.js. Tôi thấy điều này trong các tài liệu của nút-oauth:Sự cố với OAuth trên node.js

var OAuth= require('oauth').OAuth; 
var oa = new OAuth(requestUrl,accessUrl,consumerKey,consumerSecret,"1.0A",responseUrl,"HMAC-SHA1"); 

Bước tiếp theo trong official tutorial nói:

"Sau đó, có được giữ của một access token + truy cập bí mật thẻ hợp lệ theo các kênh thông thường "

Các kênh thông thường " kênh thông thường " là gì?

Tôi biết rằng người dùng phải xác thực bằng cách nào đó trên trang web "nhà cung cấp" và theo cách nào đó url phản hồi được gọi, nhưng tôi không thể tìm thấy mô tả cách triển khai. Ai đó có thể khai sáng cho tôi không?

Trả lời

23

Tôi không chắc chắn dịch vụ OAuth nào bạn đang cố kết nối nên tôi sẽ chỉ sử dụng twitter làm ví dụ. Sau khi bạn tạo đối tượng OAuth, trước tiên bạn cần yêu cầu mã thông báo oauth. Khi bạn nhận được mã thông báo đó, sau đó bạn cần chuyển hướng đến, đối với twitter, trang xác thực của họ hoặc nhắc họ đăng nhập, sau đó hỏi xem ứng dụng có được đăng nhập hay không.

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

Khi bạn lần đầu tiên tạo đối tượng OAuth, bạn đặt responseURL hoặc url gọi lại. Nó có thể là bất cứ điều gì, cho ứng dụng của tôi chỉ/oauth/callback của nó. Trong cuộc gọi lại đó, bạn nhận được mã thông báo xác minh oauth. Sau đó, bạn sử dụng cả mã thông báo yêu cầu oauth và mã thông báo xác minh oauth để yêu cầu mã thông báo truy cập. Khi bạn nhận được mã thông báo truy cập, bạn cũng sẽ nhận được bất kỳ thứ gì khác mà họ vượt qua, như tên người dùng của họ.

app.get('/oauth/callback', function(req, res, next){ 
    if (req.session.oauth) { 
    req.session.oauth.verifier = req.query.oauth_verifier 
    var oauth = req.session.oauth 

    oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
     function(error, oauth_access_token, oauth_access_token_secret, results){ 
     if (error) new Error(error) 
     console.log(results.screen_name) 
    } 
); 
} else 
    next(new Error('No OAuth information stored in the session. How did you get here?')) 
}); 

Hy vọng điều này sẽ hữu ích! Tôi đã có những vấn đề tương tự khi tôi bắt đầu này.

+0

Cảm ơn bạn rất nhiều vì điều này! Làm thế nào bạn tìm ra nó? Thử nghiệm và lỗi hoặc bạn có tìm thấy một hướng dẫn hay không? – Thomas

+1

Đã không thực sự tìm thấy một hướng dẫn. Đã tìm ra chủ yếu bằng cách truy cập tài liệu oauth twitter và lục lọi thông qua mã nguồn của mô-đun oauth – mattmcmanus

2

Mã thông báo truy cập được cấp cho ứng dụng của bạn sau khi hướng dẫn người dùng thông qua "điệu nhảy OAuth" (được biết đến một cách trìu mến). Điều này có nghĩa là lấy mã thông báo yêu cầu và chuyển hướng người dùng đến nhà cung cấp (Twitter, trong trường hợp này) để ủy quyền. Nếu người dùng cấp quyền, Twitter chuyển hướng người dùng trở lại ứng dụng của bạn bằng mã có thể được trao đổi cho mã thông báo truy cập.

nút-oauth có thể được sử dụng để quản lý quy trình này, nhưng thư viện cấp cao hơn sẽ giúp bạn dễ dàng hơn nhiều. Passport (mà tôi là tác giả của), là một thư viện như vậy. Trong trường hợp này, hãy xem hướng dẫn tới Twitter authentication, điều này giúp đơn giản hóa điệu nhảy OAuth xuống một vài dòng mã.

Sau đó, bạn có thể lưu mã thông báo truy cập trong cơ sở dữ liệu của mình và sử dụng mã thông báo truy cập tài nguyên được bảo vệ theo cách thông thường bằng nút-oauth.

+0

Passport.js có cung cấp bất kỳ phương thức nào để thực hiện oauth qua proxy http không ?? –

+1

Có một bản vá cho nút-oauth ở đây: https://github.com/ciaranj/node-oauth/pull/108 Tôi muốn thấy rằng đã hợp nhất, điều này sẽ cho phép những gì bạn đang yêu cầu. –

+0

cảm ơn một tấn giúp !! –

0

Bản cập nhật để gửi tweet để sử dụng thời gian:

@mattmcmanus, Mở rộng câu trả lời @mattmcmanus tốt đẹp, tôi muốn gửi một tweet để timeline. Đối với điều này, tôi đang sử dụng cùng một mã như mattcmanus đưa ra ở trên.

Bước 1:

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

Bước 2:

app.get('/oauth/callback', function(req, res, next){ 
     if (req.session.oauth) { 
     req.session.oauth.verifier = req.query.oauth_verifier 
     var oauth = req.session.oauth 

     oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
      function(error, oauth_access_token, oauth_access_token_secret, results){ 
      if (error) new Error(error){ 
      console.log(results.screen_name) 
      }else{ 

       // NEW CODE TO POST TWEET TO TWITTER 
       oa.post(
       "https://api.twitter.com/1.1/statuses/update.json", 
       oauth_access_token, oauth_access_token_secret, 
       {"status":"Need somebody to love me! I love OSIpage, http://www.osipage.com"}, 
       function(error, data) { 
        if(error) console.log(error) 
        else console.log(data) 
       } 
       ); 
       // POST TWEET CODE ENDS HERE 

      } 
     } 
    ); 
    } else 
     next(new Error('No OAuth information stored in the session. How did you get here?')) 
    }); 

Tôi đã thêm oauth_access_token & oauth_access_token_secret trong mã nhận xét. Điều này sẽ đăng cập nhật tweet lên dòng thời gian của người dùng. Chúc mừng tweeting !!!

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