2011-03-25 3 views
21

Я пытаюсь заставить OAuth работать на node.js. Я нашел это в документации узел-OAuth:Проблемы с OAuth на node.js

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

Следующий шаг в official tutorial говорит:

«Тогда разжиться действительным маркер доступа + маркер доступа секрета согласно обычным каналам "

Что это такое " обычные каналы "?

Я знаю, что пользователь должен как-то аутентифицироваться на сайте «vendor» и что каким-то образом вызывается URL-адрес ответа, но я не могу найти описание, как реализовать это. Может кто-нибудь просветить меня?

ответ

23

Я не уверен, что сервис OAuth вы пытаетесь подключиться, поэтому я просто использую твиттер в качестве примера. После создания объекта OAuth вам нужно сначала запросить маркер oauth. Когда вы получаете этот токен, вам нужно перенаправить на страницу Twitter на свою страницу аутентификации, которая либо предложит им войти в систему, а затем спросит, нормально ли приложение для входа в систему.

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/callback. В этом обратном вызове вы получаете токен аутентификации 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» (как его ласково известно). Это означает получение маркера запроса и перенаправление пользователя поставщику (в данном случае - Twitter) для авторизации. Если пользователь предоставляет авторизацию, Twitter перенаправляет пользователя обратно в ваше приложение с кодом, который можно обменять на токен доступа.

node-oauth можно использовать для управления этим процессом, но библиотека более высокого уровня сделает ее намного проще. Passport (который я автор), является одной из таких библиотек. В этом случае ознакомьтесь с руководством к Twitter authentication, что упростит танец OAuth до нескольких строк кода.

После этого вы можете сохранить токен доступа в своей базе данных и использовать его для доступа к защищенным ресурсам обычным способом с помощью node-oauth.

+0

. Passport.js предоставляет любой способ делать oauth через http-прокси? –

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

Я добавил oauth_access_token & oauth_access_token_secret в комментировал коде. Это опубликует обновление твита на временной шкале пользователя. Счастливое твитирование !!!

Смежные вопросы