2011-03-25 5 views
21

OAuth가 node.js에서 작동하도록하려고합니다.node.js의 OAuth 관련 문제

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

official tutorial의 다음 단계는 말한다 : 나는 노드의 OAuth의 설명서에이 발견

"그럼 일반 채널에 따라 유효한 액세스 토큰 + 액세스 토큰 비밀 잡아 "

"일반 채널 "은 무엇입니까?

사용자가 어떻게 든 "공급 업체"사이트에서 인증해야한다는 것을 알고 있으며 어떤 식 으로든 응답 URL이 호출되지만이를 구현하는 방법에 대한 설명을 찾을 수 없습니다. 누군가가 나를 계몽 할 수 있습니까?

답변

23

연결하려고하는 OAuth 서비스가 확실하지 않아 트위터를 예로 들겠습니다. OAuth 객체를 만든 후에는 먼저 oauth 토큰을 요청해야합니다. 그 토큰을 얻으면 트위터를 위해 로그인하라는 메시지를 표시하는 인증 페이지로 리디렉션해야합니다. 그런 다음 앱이 로그인해도 괜찮은지 묻습니다.

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) 
    } 
}); 

처음 OAuth 개체를 만들었을 때 responseURL 또는 콜백 URL을 설정했습니다. 그것은 내 애플 리케이션에 대한 그냥/oauth/콜백 아무것도 될 수 있습니다. 해당 콜백에서 oauth 검증 자 토큰을받습니다. 그런 다음 oauth 요청 토큰과 oauth 검증 토큰을 사용하여 액세스 토큰을 요청합니다. 액세스 토큰을 받으면 사용자 이름과 같이 전달되는 다른 메시지도 받게됩니다.

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?')) 
}); 

희망이 있습니다. 나는 이것에 착수 할 때 동일한 문제를 가지고 있었다.

+0

대단히 감사합니다. 어떻게 알아 냈어? Trial & error 또는 좋은 자습서를 찾았습니까? – Thomas

+1

튜토리얼을 찾지 못했습니다. 대부분 twitter oauth 문서를보고 oauth 모듈의 소스를 뒤적 거리며 알아 냈습니다. – mattmcmanus

2

액세스 토큰은 "OAuth dance"(그 애정 어린 것으로 알려진)를 통해 사용자를 걸어간 후에 응용 프로그램에 발급됩니다. 이것은 요청 토큰을 얻고 인증을 위해 사용자를 공급자 (이 경우에는 Twitter)로 리디렉션하는 것을 의미합니다. 사용자가 권한을 부여하면 트위터는 사용자를 액세스 토큰과 교환 할 수있는 코드로 리디렉션합니다.

node-oauth를 사용하여이 프로세스를 관리 할 수 ​​있지만 상위 레벨 라이브러리를 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다. Passport (내가이 책의 저자이기도 함)은 그러한 라이브러리 중 하나입니다. 이 경우 Twitter authentication에 대한 가이드를 확인하십시오. OAuth가 몇 줄의 코드로 단순화됩니다.

그런 다음 데이터베이스에 액세스 토큰을 저장하고 node-oauth를 사용하여 일반적인 방법으로 보호 된 리소스에 액세스 할 수 있습니다.

+0

Passport.js는 HTTP 프록시를 통해 oauth를 수행하는 모든 방법을 제공합니까 ?? –

+1

node-oauth에 대한 패치는 https://github.com/ciaranj/node-oauth/pull/108에 있습니다. 병합 된 것을보고 싶습니다. 그러면 원하는 것을 허용 할 수 있습니다. –

+0

덕분에 도움이되는 톤! –

0

업데이트는 사용자의 타임 라인에 트윗 게시 : @mattmcmanus 좋은 대답을 확장,

@mattmcmanus을, 나는 타임 라인에 트윗을 게시하고 싶습니다. 이를 위해 위에 주어진 mattcmanus와 동일한 코드를 사용하고 있습니다.

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) 
    } 
}); 

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?')) 
    }); 

I는 주석 코드 oauth_access_token_secret& oauth_access_token 첨가 하였다. 이렇게하면 사용자의 타임 라인에 트윗 업데이트가 게시됩니다. 행복한 tweeting !!!