2014-09-03 2 views
0

Я использовал passportjs и паспорт-GitHub создать социальный логин в моем приложении,Используя возвращенный маркер доступа GitHub API

passport.use(new GithubStrategy(
    { 
    clientID  : configAuth.githubAuth.clientID, 
    clientSecret : configAuth.githubAuth.clientSecret, 
    callbackURL : configAuth.githubAuth.callbackURL 
    }, 
    function(token, refreshToken, profile, done) { 
    process.nextTick(function() { 
     User.findOne({'github.id' : profile.id}, function(err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (user) { 
      return done(null, user); 
     } else { 
      var newUser = new User(); 
      newUser.github.id = profile.id, 
      newUser.token  = token, 
      newUser.name  = profile.displayName; 
      newUser.email  = profile.emails[0].value; 
      newUser.username = profile.username; 
      // save 
      newUser.save(function(err){ 
      if (err) { 
       throw err; 
      } 

      return done(null, newUser); 
      }); 
     } 
     }); 
    }); 
    } 
)); 

Теперь я использую другой компонент, называемый octonode, который требует access_token для проверки подлинности его пользователь, был знаком во время обратного вызова такой же, как этого access_token, потому что я не кажется, что проверка подлинности при выполнении этого:

var github = require('octonode'); 

exports.read = function (req, res, next) { 

    var client = github.client(); 
    client.get('/user?access_token=' + req.user.token, {}, function (err, status, body, headers) { 
    res.json(body); 
    }); 
}; 

а также пытались сделать это:

var client = github.client(req.user.token); 
client.get('/user',{}, function...) 

Я получаю пустой экран, что означает отсутствие ответа.

+0

И вы подтвердили, что 'req.user.token' фактически возвращает значение токена? – MikeSmithDev

+0

Да, это фактически возвращает значение, некоторый хэш-джиббери. –

+0

Я думаю, req.user.token отличается от токена, возвращаемого github. –

ответ

2

Хорошо, когда один ответ на SO утверждает, что:

Обратите внимание, что паспорт не активно использовать маркер доступа или обновить маркер, кроме как принести профиль пользователя при входе в систему. Приложение является ответственным за использование этих токенов при выполнении любых запросов API. Таким образом, вы можете реализовать любой описанный вами метод, Passport не участвует в этом процессе.

В access_tokens возвращаются к вам, но он не обрабатывает его после того, как, ты один отвечает, чтобы сохранить его или делать то, что вы хотите.

Мой код в основном вдохновлен учебным пособием в facebook автора Scotch.io с использованием паспорта. Там они не обновляют токен при каждом входе в систему, потому что им не нужно в своем учебнике, но они сохраняют его в базе данных, проверяют их source code

С несколькими комментариями и отладкой я обнаружил, что это преступник в моем приложении, поэтому мне нужно обновить условие, которое указывает, что пользователь найден, обновляет токен и некоторые значения, поэтому некоторые важные данные будут сохраняться при входе в систему.

if (user) { 
    user.token = token; 
    user.name = profile.displayName; 
    user.email = profile.emails[0].value; 
    user.save(); 
    return done(null, user); 
} 

И теперь это будет работать просто отлично:

var client = github.client(req.user.token); 
client.get('/user', {}, function (err, status, body, headers) { 
    res.json(body); 
}); 

Благодаря @MikeSmithDev за помощь мне.