Подтвердить что ты не робот

Проблемы с OAuth на node.js

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

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

Следующий шаг в официальном учебнике гласит:

"Затем получите доступный токен доступа + ключ доступа к токенам в соответствии с нормальными каналами"

Каковы эти "нормальные каналы" ?

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

4b9b3361

Ответ 1

Я не уверен, какую службу 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?'))
});

Надеюсь, это поможет! У меня были те же проблемы, когда я начал с этого.

Ответ 2

Токен доступа выдается вашему приложению после ходьбы пользователя через "танец OAuth" (как его ласково известно). Это означает получение маркера запроса и перенаправление пользователя поставщику (в данном случае - Twitter) для авторизации. Если пользователь предоставляет авторизацию, Twitter перенаправляет пользователя обратно в ваше приложение с кодом, который можно обменять на токен доступа.

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

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

Ответ 3

Обновление для публикации твитов для пользовательской временной шкалы:

@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. Это опубликует обновление твита для пользовательской временной шкалы. Счастливое твитирование!!!